我想在我的windows机器上用C截图,然后保存为jpg或bmp或其他格式。无论如何,我试着自己做,它没问题,工作很好,但它慢得令人无法忍受,不像prt scr
键-我想知道是否有一种方法可以访问prt scr
剪贴板,并以某种方式粘贴在jpg/png文件或如果有更快的方法来获得所有的屏幕像素。这是我的代码:
int main()
{
bitmap_t pic;
int i, j;
pic.width = GetSystemMetrics(SM_CXSCREEN);
pic.height = GetSystemMetrics(SM_CYSCREEN);
pic.pixels = (pixel_t**)malloc(sizeof(pixel_t*)*pic.width);
for(i = 0 ; i < pic.height ; i++)
{
pic.pixels[i] = (pixel_t*)malloc(sizeof(pixel_t)*pic.height);
}
HDC hdc = GetDC(NULL);
COLORREF c;
printf("Size of your monitor is %d by %d.\n", pic.width, pic.height);
for(i = 0 ; i < pic.width ; i++)
{
for(j = 0 ; j < pic.height ; j++)
{
c = GetPixel(hdc, i, j);
pic.pixels[i][j].red = (uint8_t)GetRValue(c);
pic.pixels[i][j].green = (uint8_t)GetGValue(c);
pic.pixels[i][j].blue = (uint8_t)GetBValue(c);
}
}
ReleaseDC(NULL, hdc);
save_png_to_file(&pic, "D:\\pic.png");
for(i = 0 ; i < pic.height ; i++)
{
free(pic.pixels[i]);
}
free(pic.pixels);
return 0;
}
字符串
函数save_png_to_file
工作正常,循环时间太长(我的屏幕是1366 x768,超过百万个循环条目)-为什么当键prt scr
轻松完成时,它会这么慢?
2条答案
按热度按时间64jmpszr1#
嗯.
GetPixel()
本身真的很慢,然后将它结合在一个循环中,并进行多次重复.字符串
x3naxklr2#
这是在这里解释:
http://msdn.microsoft.com/en-us/library/dd183402(v=vs.85).aspx
请参阅示例中的
CaptureAnImage()
函数。整个代码有点复杂,因为它是一个完整的win32应用程序,但它显示了如何捕获特定窗口并保存到filename.bmp
。