#包含?& ltstdio.h & gt
#包含?& ltstdlib.h & gt
#包含?& ltstring.h & gt
#包含?& ltx 11/xlib . h & gt;
#包含?& ltjpeglib.h & gt
/***************************************************************
寫?希馬格?數據?去哪?答?JPEG?文件
必須?包括?& ltjpeglib.h & gt
回歸?價值:
0?-?不成功的
1?-?成功
****************************************************************/
靜電?夏爾?err _ str[256];
int?jpegwritefilefroimage(char?*文件名,?XImage*?img)
{
文件*?FP;
struct?jpeg_compress_struct?cinfo
struct?jpeg_error_mgr?jerr
fp?=?fopen(文件名,“WB”);
if(fp==NULL)
{
memset(err_str,?0,?sizeof(err _ str));
sprintf(err_str,"不能?寫?文件?%s”,文件名);
err _ exit(" jpegwritefilefroimage ",err _ str);
回歸?0;
}
cinfo.err?=?jpeg_std_error。jerr);
jpeg_create_compresscinfo);
JPEG _ stdio _ dest(& amp;cinfo,FP);
cinfo.image_width?=?img-& gt;寬度;
cinfo.image_height?=?img-& gt;身高;
cinfo.input_components?=?3;
cinfo.in_color_space?=?JCS _ RGB
JPEG _ set _ defaults(& amp;cinfo);
jpeg_start_compress。cinfo,真);
JSAMPROW?row _ pointer[1];/*?指針?去哪?掃描線?*/
未簽名?char*?pBuf?=?(未簽名?char *)malloc(3 * img-& gt;寬度);
row_pointer[0]?=?pBuf
int?I = 0;
while(cinfo.next_scanline?& lt?cinfo.image_height)
{
int?j = 0;
for(I = 0;我& ltimg-& gt;寬度;i++)
{
//memcpy(pBuf+j,img-& gt;data+cinfo . next _ scanline * img-& gt;bytes_per_line+i*4,3);
*(pBuf+j)?=?*(img->;data+cinfo . next _ scanline * img-& gt;bytes _ per _ line+I * 4+2);
*(pBuf+j+1)?=?*(img->;data+cinfo . next _ scanline * img-& gt;bytes _ per _ line+I * 4+1);
*(pBuf+j+2)?=?*(img->;data+cinfo . next _ scanline * img-& gt;bytes _ per _ line+I * 4);
j+= 3;
}
JPEG _ write _ scanlines(& amp;cinfo,row_pointer,1);
}
免費(pBuf);
jpeg_finish_compress。cinfo);
JPEG _ destroy _ compress(& amp;cinfo);
fclose(FP);
回歸?1;
}
/*****************************************************************
俘獲?答?本地的?截圖?的?那個?桌面,
儲蓄?去哪?那個?文件?指定的?被誰?文件名。
如果?類型?=?0,?然後呢?寫?答?位圖?文件,?其他
寫?答?JPEG?文件。
回歸?價值:
0?-?失敗
1?-?成功
******************************************************************/
int?CaptureDesktop(char*?文件名,?int?類型)
{
窗戶?桌面;
顯示*?dsp
XImage*?img
int?屏幕_寬度;
int?屏幕_高度;
dsp?=?XOpenDisplay(空);/*?連接?去哪?答?本地的?展示?*/
if(NULL==dsp)
{
//sprintf(err_str,"錯誤:不能?連接?去哪?本地的?display \ n ");
err_exit("CaptureDesktop ","不能?連接?去哪?本地的?顯示”);
回歸?0;
}
桌面?=?RootWindow(dsp,0);/*?參考?去哪?那個?根?窗戶?*/
if(0 = =桌面)
{
//printf("不能?得到?根?window \ n ");
err_exit("CaptureDesktop ","不能?得到?根?窗口”);
回歸?0;
}
/*?檢索?那個?寬度?然後呢。那個?身高?的?那個?屏幕?*/
屏幕_寬度?=?顯示寬度(dsp,0);
屏幕_高度?=?DisplayHeight(dsp,0);
/*?得到?那個?形象?的?那個?根?窗戶?*/
img?=?XGetImage(dsp,desktop,0,0,screen_width,screen_height,~0,ZPixmap);
如果(類型==0)
BmpWriteFileFromImage(文件名,img);
其他
JpegWriteFileFromImage(文件名,img);
XDestroyImage(img);
xclosedidisplay(DSP);
回歸?1;
}
主()
{
CaptureDesktop("。/screenshot.bmp ",0);
//CaptureDesktop("。/screenshot.jpg ",1);
printf("完成。\ n ");
}