Est-il possible de sauvegarder une HIMAGELIST en bmp

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 3 déc. 2004 à 11:56
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 3 déc. 2004 à 16:01
comme l'explique le titre j'aurai besoin de sauvegarder une HIMAGELIST ke je crée dans un prog et j'aimerais le save dans un bmp

idée???
si vous avez une fonction n'hésiter po
youpi :)

6 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 déc. 2004 à 12:27
avec ImageList_GetImageInfo tu peux récupérer le HBITMAP interne avec les images de la liste dans la structure IMAGEINFO.

A partir de ce HBITMAP tu pouras le sauvegarder dans un fichier *.bmp un ex ici :
http://www.cppfrance.com/codes/SCR2BMP/27874.aspx)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
3 déc. 2004 à 13:07
je te remercie je v jeter un coup d'oeil si j'ai des probleme je te recontact

youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
3 déc. 2004 à 13:29
ok maintenant mon probleme c de save une HBITMAP en BMP :D

j'ai fais ca

IMAGEINFO FAR *pImageInfo;
ImageList_GetImageInfo(
himl2,
0,
pImageInfo
);
j'ai mon HBITMAP (pImageInfo->hbmImage) mais
comment le sauvegarder j'ai regarder le code et il me mank des info sur la dimension (L*l) dans le source ke tu m'as donner

youpi :)
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
3 déc. 2004 à 13:55
j'ai testé ca fourni par msdn

IMAGEINFO FAR *pImageInfo;
ImageList_GetImageInfo(
himl2,
0,
pImageInfo
);

HDC Hdcc=GetDC(NULL);
PBITMAPINFO bitmpinfo=CreateBitmapInfoStruct(0,pImageInfo->hbmImage);
CreateBMPFile(mainHwnd, "D:\\Bureau\", bitmpinfo,
pImageInfo->hbmImage, Hdcc);

ou les fonction sont celle-ci
void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
HBITMAP hBMP, HDC hDC)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp;

pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);



// Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
DIB_RGB_COLORS) ;


// Create the .BMP file.
hf = CreateFile(pszFile,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
hdr.bfType 0x4d42; // 0x42 "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.
WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL);


// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL));

// Copy the array of color indices into the .BMP file. dwTotal cb pbih->biSizeImage;
hp = lpBits;
WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);

// Close the .BMP file.
CloseHandle(hf);

// Free memory.
GlobalFree((HGLOBAL)lpBits);
}

PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;

// Retrieve the bitmap color format, width, and height.
GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);

// Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;

// Allocate memory for the BITMAPINFO structure. (This structure
// contains a BITMAPINFOHEADER structure and an array of RGBQUAD
// data structures.)

if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits));

// There is no RGBQUAD array for the 24-bit-per-pixel format.

else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER));

// Initialize the fields in the BITMAPINFO structure.

pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);

// If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB;

// Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
// For Windows NT, the width must be DWORD aligned unless
// the bitmap is RLE compressed. This example shows this.
// For Windows 95/98/Me, the width must be WORD aligned unless the
// bitmap is RLE compressed.
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
* pbmi->bmiHeader.biHeight;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}

ca merde sur PBITMAPINFO bitmpinfo=CreateBitmapInfoStruct(0,pImageInfo->hbmImage);
me di ke la memoire ne peut etre read!!!

une idée???????
youpi :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 déc. 2004 à 14:43
Pour récupérer la taille d'un bitmap :
HBITMAP hBmp;
BITMAP bmpInfo;
GetObject(hBmp, sizeof(BITMAP), &bmpInfo);

BITMAPINFOHEADER bmih,
bmih.biSize          = sizeof(BITMAPINFOHEADER);
bmih.biWidth         = bmpInfo.bmWidth;
bmih.biHeight        = bmpInfo.bmHeight;
bmih.biBitCount      = 24
bmih.biCompression   = BI_RGB;
bmih.biPlanes        = 1;  
bmih.biSizeImage     = 0;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed       = 0;
bmih.biClrImportant  = 0;
BITMAPINFO bmi;
bmi.bmiHeader = bmih;

// nombre d'octets par ligne (doit être multiple de 4)
DWORD dwBPL = 4*(((bmpInfo.bmWidth*3)+3)/4);
BYTE* pPixels = new BYTE[dwBPL*bmpInfo.bmHeight];

HDC hdc = GetDC(NULL);
GetDIBits(hdc, hBmp, 0,  bmpInfo.bmHeight, pPixels, &bmi, DIB_RGB_COLORS));

BITMAPFILEHEADER bhf;
bfh.bfType      = 0x4d42;
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0; 
bfh.bfOffBits   = sizeof(BITMAPINFOHEADER);
bfh.bfSize      = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + dwBPL*bmpInfo.bmHeight;
                            
DWORD dwTmp;                            
WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwTmp, NULL);
    
WriteFile(hFile, &bmih, sizeof(BITMAPINFOHEADER), &dwTmp, NULL);
    
WriteFile(hFile, pPixels, dwBPL*bmpInfo.bmHeight, &dwTmp, NULL);

0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
3 déc. 2004 à 16:01
c bon je viens de trouver

le probleme venait de la...

IMAGEINFO pImageInfo;
ImageList_GetImageInfo(himl2,20,&pImageInfo);

HDC Hdcc=GetDC(NULL);
PBITMAPINFO bitmpinfo=CreateBitmapInfoStruct(0,pImageInfo.hbmImage);
CreateBMPFile(mainHwnd, "D:\\Bureau\\tmp.bmp", bitmpinfo,
pImageInfo.hbmImage, Hdcc);
moi et les pointeur lol :D
youpi :)
0
Rejoignez-nous