-
-
Save philip-goh/3865787 to your computer and use it in GitHub Desktop.
#include <iostream> | |
#include <windows.h> | |
#include <gdiplus.h> | |
#include <memory> | |
using namespace Gdiplus; | |
using namespace std; | |
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) | |
{ | |
UINT num = 0; // number of image encoders | |
UINT size = 0; // size of the image encoder array in bytes | |
ImageCodecInfo* pImageCodecInfo = NULL; | |
GetImageEncodersSize(&num, &size); | |
if(size == 0) | |
{ | |
return -1; // Failure | |
} | |
pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); | |
if(pImageCodecInfo == NULL) | |
{ | |
return -1; // Failure | |
} | |
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; // Success | |
} | |
} | |
free(pImageCodecInfo); | |
return -1; // Failure | |
} | |
void BitmapToJpg(HBITMAP hbmpImage, int width, int height) | |
{ | |
Bitmap *p_bmp = Bitmap::FromHBITMAP(hbmpImage, NULL); | |
//Bitmap *p_bmp = new Bitmap(width, height, PixelFormat32bppARGB); | |
CLSID pngClsid; | |
int result = GetEncoderClsid(L"image/jpeg", &pngClsid); | |
if(result != -1) | |
std::cout << "Encoder succeeded" << std::endl; | |
else | |
std::cout << "Encoder failed" << std::endl; | |
p_bmp->Save(L"screen.jpg", &pngClsid, NULL); | |
delete p_bmp; | |
} | |
bool ScreenCapture(int x, int y, int width, int height, char *filename) | |
{ | |
HDC hDc = CreateCompatibleDC(0); | |
HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height); | |
SelectObject(hDc, hBmp); | |
BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY); | |
BitmapToJpg(hBmp, width, height); | |
DeleteObject(hBmp); | |
return true; | |
} | |
int main() { | |
// Initialize GDI+. | |
GdiplusStartupInput gdiplusStartupInput; | |
ULONG_PTR gdiplusToken; | |
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); | |
int x1 = 0; | |
int y1 = 0; | |
int x2 = GetSystemMetrics(SM_CXSCREEN); | |
int y2 = GetSystemMetrics(SM_CYSCREEN); | |
ScreenCapture(x1, y1, x2 - x1, y2 - y1, "screen.jpg"); | |
//Shutdown GDI+ | |
GdiplusShutdown(gdiplusToken); | |
return 0; | |
} |
Simple as it can be. If you get unresolved externals, do not forget to link with Gdiplus.lib
Looks like filename isn't used anywhere in your ScreenCapture function
Hi, I'm a C++ greenhorn.
Can anyone write how to "link with Gdiplus.lib"?
add this after #include
#pragma comment (lib,"Gdiplus.lib")
WTF?!
what for a argument "filename" in function "bool ScreenCapture()"?
he does nothing
Very great job, but the image seems to lose lot of quality
Great stuff! Thanks for this!
In mingw if error: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
Change: bool ScreenCapture(int x, int y, int width, int height, char *filename)
To: bool ScreenCapture(int x, int y, int width, int height, char *filename = (char *)"");
Just copied your code and compiled !
+1 star for simplicity
niubility
awesome, great job!