c语言怎么显示一个全屏的图片,C语言运行出全屏的的图像怎样截取?

MS VC++ 的 c 程序可以实现。

方法:

(1)用键盘按键程序模拟法,把图像发送到clipboard

(2)把clipboard图像存入.bmp 图像文件(或别的格式)。

编译:

cl simu_keyboard.c user32.lib Gdi32.lib

特殊头文件:

#include

#include

#include

提示:

(1)按键程序模拟子程序:

void snapscreen_2_clipboard()

{

keybd_event(VK_SNAPSHOT,0x2C,0,0);

keybd_event(VK_SNAPSHOT,0x2C,KEYEVENTF_KEYUP,0);

}

(2)clipboard图像存入.bmp 图像文件

FILE *fout;

/* --------------------------------------------------------------

* dib

int GetBytesPerPixel(int depth);

int GetBytesPerRow(int width, int depth);

int GetBitmapBytes(int width, int height, int depth);

* --------------------------------------------------------------*/

int GetBytesPerPixel(int depth)

{ return (depth==32 ? 4 : 3);

}

int GetBytesPerRow(int width, int depth)

{

int bytesPerPixel = GetBytesPerPixel(depth);

int bytesPerRow = ((width * bytesPerPixel + 3) & ~3);

return bytesPerRow;

}

// bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, bmi.bmiHeader.biBitCount

int GetBitmapBytes(int width, int height, int depth)

{

return height * GetBytesPerRow(width, depth);

}

void save_clipboard_img_to_bmp()

{

char nameout[80];

HANDLE h_bitmap,h_dib;

BITMAPINFO bmi;

HDC hDC;

int imageBytes;

BITMAPFILEHEADER hdr;

int scanLineCount;

unsigned char *img;

if (!OpenClipboard(NULL)) {

printf("Can not open clipboard\n");

exit(0);

};

if (DEBUG ==1) printf("pass open clipboard\n");

// HANDLE GetClipboardData(UINT uFormat);

h_bitmap = GetClipboardData(CF_BITMAP);

h_dib = GetClipboardData(CF_DIB);

if (h_bitmap ==NULL || h_dib ==NULL){

printf("I got NULL bitmap: ");

} else { printf("I got bitmap: ");};

memcpy(&bmi,h_dib,sizeof(bmi));

printf("%d x %d \n",bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight);

hDC = CreateCompatibleDC(NULL); // Gdi32.lib.

CloseClipboard();

bmi.bmiHeader.biCompression = BI_RGB;

// possible to use part of imgage with img_w,img_h

imageBytes = GetBitmapBytes(bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, bmi.bmiHeader.biBitCount);

printf("pass GetBitmapBytes=%d \n",imageBytes);

img = (char *) malloc(imageBytes);

if (!img) {

printf("No enought memory for img !\n"); exit(0);

}

// BITMAPFILEHEADER hdr;

hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"

hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

+ (bmi.bmiHeader.biClrUsed * sizeof(RGBQUAD)) + bmi.bmiHeader.biSizeImage;

hdr.bfReserved1 = 0;

hdr.bfReserved2 = 0;

hdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

+ (bmi.bmiHeader.biClrUsed * sizeof(RGBQUAD));

scanLineCount = GetDIBits(hDC,h_bitmap,0,bmi.bmiHeader.biHeight, img, &bmi, DIB_RGB_COLORS);

strcpy(nameout,"keyb_tmp.bmp");

if ( (fout = fopen(nameout,"wb") ) == NULL ) {

printf("\007Cann't open output file: %s ", nameout);exit(1);

};

fwrite( &hdr, sizeof(BITMAPFILEHEADER ), 1, fout );

fwrite( &bmi, sizeof(BITMAPINFO), 1, fout );

fwrite( img, sizeof(unsigned char),imageBytes, fout );

fclose(fout);

printf("Output in %s\n",nameout);

}

/* -------end dib and bmp ----- */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值