Pas de dépendances
#include <Windows.h> #include <GdiPlus.h> #include <stdio.h> #pragma comment(lib, "gdiplus.lib") 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 Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL; Gdiplus::GetImageEncodersSize(&num, &size); if(size == 0) return -1; // Failure pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; // Failure Gdiplus::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 SauverJPG(const wchar_t* fic,int width,int height,const char* flux) { Gdiplus::Bitmap B(width,height); int i,j,curs; HWND Hcon = GetConsoleWindow(); HDC Hdc = GetDC(Hcon); for(curs=0,j=height-1;j>=0;j--) { for(i=0;i<width;i++,curs+=4) { Gdiplus::Color col(flux[curs+2],flux[curs+1],flux[curs]); B.SetPixel(i,j,col); } } CLSID jpgClsid; GetEncoderClsid(L"image/jpeg", &jpgClsid); if (B.Save(fic,&jpgClsid,NULL)==Gdiplus::Ok) printf("Sauvegarde ok\n"); else printf("Sauvegarde echoue\n"); ReleaseDC(Hcon, Hdc); } int main(void) { unsigned long m_gdiplusToken; Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); if(OpenClipboard(NULL)) { HANDLE h; h = GetClipboardData(CF_DIBV5); if(h) { BITMAPV5HEADER head; char *brut = (char *)GlobalLock(h); head = *((BITMAPV5HEADER*)brut); SauverJPG(L"out.jpg",head.bV5Width,head.bV5Height,brut+head.bV5Size); GlobalUnlock(h); CloseClipboard(); } else printf("Pas d'image dans le presse papier\n"); CloseClipboard(); } Gdiplus::GdiplusShutdown(m_gdiplusToken); return 0; }
No explanations yet.