Sauvegarder graphique dans image sous GDI+

Le
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 !!!
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #21199951
On 15 fév, 10:36, "Philippe Gremillet"
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;
}
Philippe Gremillet
Le #21201461
"Christian ASTOR" news:
On 15 fév, 10:36, "Philippe Gremillet"
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...
Christian ASTOR
Le #21201811
On 15 fév, 16:36, "Philippe Gremillet"
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)
Publicité
Poster une réponse
Anonyme