【发布时间】:2020-03-30 05:01:10
【问题描述】:
我想拍一张 PNG 格式的屏幕截图。
但是我有一个严重的问题,我认为这对教授来说似乎很容易。
1。如何从位图(类)中获取图像缓冲区。
2. 我用的是多显示器,也有不同的分辨率。如何获得全屏分辨率。
实施:
#pragma comment (lib, "gdiplus.lib")
#include "stdafx.h"
#include <afxwin.h>
#include <stdio.h>
#include <tchar.h>
#include <gdiplus.h>
using namespace Gdiplus;
DWORD PNGScreenshot();
INT GetEncoderClsid(const WCHAR * format, CLSID* pClsid);
INT GetEncoderClsid(const WCHAR * format, CLSID* pClsid)
{
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if (size == 0)
return -1;
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if (pImageCodecInfo == NULL)
return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for (UINT j = 0; j < num; j++)
{
if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -1;
}
DWORD PNGScreenshot()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
HDC hScreenDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
INT x = GetDeviceCaps(hScreenDC, HORZRES);
INT y = GetDeviceCaps(hScreenDC, VERTRES);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, x, y);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemoryDC, hBitmap);
StretchBlt(hMemoryDC, 0, 0, x, y, hScreenDC, 0, 0, x, y, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemoryDC, hOldBitmap);
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
Bitmap *bmp = new Bitmap(hBitmap, NULL);
// Get Image Buffer from Bitmap
// GetBufferFromBitmap(LPBYTE lpImageBuffer, Bitmap * bmp);
// {
// 1. Get Size of Bitmap
// 2. Get Image buffer from Bitmap
// 3. Copy Image buffer to lpImageBuffer
// }
// ... Do ...
delete bmp;
GdiplusShutdown(gdiplusToken);
return GetLastError();
}
int _tmain(int argc, _TCHAR* argv[])
{
PNGScreenshot();
return 0;
}
这只是我的实现,那么有没有其他方法可以将PNG屏幕截图作为缓冲区?
【问题讨论】:
-
我用了
INT x = GetSystemMetrics(SM_XVIRTUALSCREEN);INT y = GetSystemMetrics(SM_YVIRTUALSCREEN);但同样的问题发生了。
标签: image-processing visual-c++ screenshot gdi+ screen-resolution