Bonjour,
je veux convertir une image BMP DIB en DDB. J'ai trouvé le code suivantqui marche bien jusqu'à un certain nombre d'utilisation (en gros 55fois) !
HBITMAP ConvertDIBDDB()
{
LPBITMAPINFOHEADER lpbi;
HBITMAP hbmDDBconv;
CPalette pal;
CPalette* pOldPal;
CClientDC dcDIB(NULL);
CString infoCS;
lpbi = (LPBITMAPINFOHEADER)pstBitmapInfo;
int nColors = lpbi->biClrUsed ? lpbi->biClrUsed : 1 << lpbi->biBitCount;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)pstBitmapInfo;
LPVOID lpDIBBits;
if (bmInfo.bmiHeader.biBitCount > 8)
{
lpDIBBits =(LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3:0));
}
else
{
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
infoCS.Format("%d",bmInfo.bmiHeader.biBitCount);
}
if (nColors <= 256)
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;
for (int i = 0;i<nColors;i++)
{
pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
pal.CreatePalette(pLP);
delete[] pLP;
pOldPal = dcDIB.SelectPalette(&pal,FALSE);
dcDIB.RealizePalette();
}
hbmDDBconv =CreateDIBitmap(dcDIB.GetSafeHdc(),(LPBITMAPINFOHEADER)lpbi,(LONG)CBM_INIT,lpDIBBits,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
if (pal.GetSafeHandle())
dcDIB.SelectPalette(pOldPal,FALSE);
return hbmDDBconv;
}
J'ai essayé de surpprimer pal et pOldPal, le problème persite.
Parcontre, je n'arrive pas à supprimer le dcDIB (la compilation est OKmais il y a une erreur dans le pg : Debug Assertion Failed ...File:wingdi.cpp)
Quelqu'un a-t-il une idée SVP ?
Merci.