-
-
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!