Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Sauvegarder graphique dans image sous GDI+

3 réponses
Avatar
Philippe Gremillet
Bonjour à tous !

Toutes mes excuses si ce message est hors-sujet...

Je viens de regarder d'un peu prêt GDI+ qui semble tentant à utiliser par
rapport à DGI.
Je n'ai toutefois pas trouvé comment faire pour, ayant un dessin affiché
dans un HDC lié à un Graphics, le sauvegarder dans une image au format BMP
ou JPEG ?

Merci de votre aide et mille pardons par avance si jamais la réponse était
triviale !!!

3 réponses

Avatar
Christian ASTOR
On 15 fév, 10:36, "Philippe Gremillet" wrote:

Je viens de regarder d'un peu prêt GDI+ qui semble tentant à utiliser par
rapport à DGI.
Je n'ai toutefois pas trouvé comment faire pour, ayant un dessin affich é
dans un HDC lié à un Graphics, le sauvegarder dans une image au forma t BMP
ou JPEG ?



Pour sauvegarder un DC, par exemple en JPEG =>


BOOL DumpDCToJpeg(HDC hDC, LPWSTR pszName)
{
HWND hWnd = NULL;
HDC hDCMem = NULL;
RECT rect = { 0 };
BITMAPINFOHEADER bi = { 0 };
HBITMAP hBitmap = NULL, hBitmapOld = NULL;
PBYTE pBytes = NULL;
CLSID jpgClsid;
Bitmap *pBitmap = NULL;
HRESULT hr = E_FAIL;
int nRet = 0;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
if (GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) ==
Ok)
{
hWnd = WindowFromDC(hDC);
hDCMem = CreateCompatibleDC(hDC);
if (hWnd && hDCMem)
{
GetWindowRect(hWnd, &rect);
bi.biSize = sizeof(bi);
bi.biWidth = rect.right - rect.left;
bi.biHeight = rect.bottom - rect.top;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
hBitmap = CreateDIBSection(hDCMem, (BITMAPINFO*)&bi,
DIB_RGB_COLORS, (void**)&pBytes, NULL, NULL);
if (hBitmap)
{
hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap);
if (BitBlt(hDCMem, 0, 0, bi.biWidth, bi.biHeight, hDC, 0, 0,
SRCCOPY))
{
pBitmap = new Bitmap((BITMAPINFO*)&bi, (void*)pBytes);
if (pBitmap)
{
// GetEncoderClsid() from MSDN
if (SUCCEEDED(GetEncoderClsid(L"image/jpeg", &jpgClsid)))
{
CLSID encoderClsid;
EncoderParameters encoderParameters;
hr = GetEncoderClsid(IMAGE_CACHE_COMPRESS_MIME_TYPE,
&encoderClsid);
if (SUCCEEDED(hr))
{
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type =
EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
long quality = 100;
encoderParameters.Parameter[0].Value = &quality;
}
hr = pBitmap->Save(pszName, &jpgClsid, &encoderParameters);
if (SUCCEEDED(hr))
nRet = 1;
}
delete pBitmap;
}
}
SelectObject(hDCMem, hBitmapOld);
DeleteObject(hBitmap);
}
DeleteDC(hDCMem);
}
GdiplusShutdown(gdiplusToken);
}
return nRet;
}
Avatar
Philippe Gremillet
"Christian ASTOR" a écrit dans le message de
news:
On 15 fév, 10:36, "Philippe Gremillet" wrote:

Je viens de regarder d'un peu prêt GDI+ qui semble tentant à utiliser par
rapport à DGI.
Je n'ai toutefois pas trouvé comment faire pour, ayant un dessin affiché
dans un HDC lié à un Graphics, le sauvegarder dans une image au format BMP
ou JPEG ?



Pour sauvegarder un DC, par exemple en JPEG =>


BOOL DumpDCToJpeg(HDC hDC, LPWSTR pszName)
{
HWND hWnd = NULL;
HDC hDCMem = NULL;
RECT rect = { 0 };
BITMAPINFOHEADER bi = { 0 };
HBITMAP hBitmap = NULL, hBitmapOld = NULL;
PBYTE pBytes = NULL;
CLSID jpgClsid;
Bitmap *pBitmap = NULL;
HRESULT hr = E_FAIL;
int nRet = 0;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
if (GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) = Ok)
{
hWnd = WindowFromDC(hDC);
hDCMem = CreateCompatibleDC(hDC);
if (hWnd && hDCMem)
{
GetWindowRect(hWnd, &rect);
bi.biSize = sizeof(bi);
bi.biWidth = rect.right - rect.left;
bi.biHeight = rect.bottom - rect.top;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
hBitmap = CreateDIBSection(hDCMem, (BITMAPINFO*)&bi,
DIB_RGB_COLORS, (void**)&pBytes, NULL, NULL);
if (hBitmap)
{
hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap);
if (BitBlt(hDCMem, 0, 0, bi.biWidth, bi.biHeight, hDC, 0, 0,
SRCCOPY))
{
pBitmap = new Bitmap((BITMAPINFO*)&bi, (void*)pBytes);
if (pBitmap)
{
// GetEncoderClsid() from MSDN
if (SUCCEEDED(GetEncoderClsid(L"image/jpeg", &jpgClsid)))
{
CLSID encoderClsid;
EncoderParameters encoderParameters;
hr = GetEncoderClsid(IMAGE_CACHE_COMPRESS_MIME_TYPE,
&encoderClsid);
if (SUCCEEDED(hr))
{
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
long quality = 100;
encoderParameters.Parameter[0].Value = &quality;
}
hr = pBitmap->Save(pszName, &jpgClsid, &encoderParameters);
if (SUCCEEDED(hr))
nRet = 1;
}
delete pBitmap;
}
}
SelectObject(hDCMem, hBitmapOld);
DeleteObject(hBitmap);
}
DeleteDC(hDCMem);
}
GdiplusShutdown(gdiplusToken);
}
return nRet;
}

///////////////////////////////////////////
Merci pour l'info !
Ceci dit, on en revient à créer un dc en mémoire, une DibSection, un BilBlt,
bref, Gdi+ n'a pas l'air de s'en sortir tout seul (sauf pour l'encodage
JPEG, ce qui n'est déjà pas si mal), un peu dommage mais z'enfin bon...
Avatar
Christian ASTOR
On 15 fév, 16:36, "Philippe Gremillet" wrote:

Merci pour l'info !
Ceci dit, on en revient à créer un dc en mémoire, une DibSection, u n BilBlt,
bref, Gdi+ n'a pas l'air de s'en sortir tout seul (sauf pour l'encodage
JPEG, ce qui n'est déjà pas si mal), un peu dommage mais z'enfin bon. ..



Cela dépend de ce que l'on veut faire.
On n'est pas obligé d'utiliser un DC.
Par ex, avec la classe Image pour les conversions
(http://msdn.microsoft.com/en-us/library/ms533837(VS.85).aspx)