-
-
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; | |
} |
awesome, great job!
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
Cant compile , lots of errors.
Lots of unresolved externals how do i fix this