从GDI+的Bitmap对象得到设备无关位图句柄
2005-03-09 20:44
513 查看
HANDLE BitmapToDib(Bitmap* pBitmap)
{
WORD biBits;
BITMAPINFOHEADER bi;
BITMAPINFOHEADER FAR *lpbi;
DWORD dwLen;
HANDLE hdib;
HANDLE h;
HDC hdc;
HPALETTE hpal;
if (!pBitmap)
return NULL;
PixelFormat format = pBitmap->GetPixelFormat();
switch(format) {
case PixelFormat1bppIndexed:
biBits = 1;
break;
case PixelFormat4bppIndexed:
biBits = 4;
break;
case PixelFormat8bppIndexed:
biBits = 8;
break;
case PixelFormat24bppRGB:
biBits = 24;
break;
case PixelFormat32bppRGB:
biBits = 32;
break;
}
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = pBitmap->GetWidth();
bi.biHeight = pBitmap->GetHeight();
bi.biPlanes = 1;
bi.biBitCount = biBits;
bi.biCompression = 0;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
//Get Palette size
UINT size = pBitmap->GetPaletteSize();
ColorPalette* palette = (ColorPalette*)malloc(size);
pBitmap->GetPalette(palette, size);
//Get data size
BitmapData bmd;
pBitmap->LockBits(new Rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()),
ImageLockModeRead, format, &bmd);
bi.biSizeImage = bmd.Height * bmd.Stride;
dwLen = bi.biSize + palette->Count * sizeof(RGBQUAD) + bi.biSizeImage;
hdib = GlobalAlloc(GHND,dwLen);
lpbi = (BITMAPINFOHEADER FAR *)GlobalLock(hdib);
*lpbi = bi;
memcpy(lpbi, &bi, bi.biSize);
RGBQUAD* pPal = (RGBQUAD*)((BYTE*)lpbi + bi.biSize);
// pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + palette->Count * sizeof(PALETTEENTRY));
if(size > 0)
{
// pPal->palNumEntries = palette->Count;
// pPal->palVersion = PALVERSION;
for (int i = 0; i < palette->Count; i++){
pPal[i].rgbRed = GetRValue(palette->Entries[i]);
pPal[i].rgbGreen = GetGValue(palette->Entries[i]);
pPal[i].rgbBlue = GetBValue(palette->Entries[i]);
pPal[i].rgbReserved = (BYTE)0;
}
// hpal = CreatePalette(pPal);
// LocalFree((HANDLE)pPal);
}
// PBYTE pdata = (PBYTE)(pPal + palette->Count * sizeof(RGBQUAD));
PBYTE pdata = (PBYTE)lpbi + bi.biSize + palette->Count * sizeof(RGBQUAD);
PBYTE pSrc = (PBYTE)bmd.Scan0;
for (int r = bmd.Height - 2; r >= 0; r--)
{
memcpy(pdata, pSrc + r * bmd.Stride, bmd.Stride);
pdata += bmd.Stride;
}
// memcpy(pdata, bmd.Scan0, bmd.Height * bmd.Stride);
bi = *lpbi;
GlobalUnlock(hdib);
pBitmap->UnlockBits(&bmd);
return hdib;
}
{
WORD biBits;
BITMAPINFOHEADER bi;
BITMAPINFOHEADER FAR *lpbi;
DWORD dwLen;
HANDLE hdib;
HANDLE h;
HDC hdc;
HPALETTE hpal;
if (!pBitmap)
return NULL;
PixelFormat format = pBitmap->GetPixelFormat();
switch(format) {
case PixelFormat1bppIndexed:
biBits = 1;
break;
case PixelFormat4bppIndexed:
biBits = 4;
break;
case PixelFormat8bppIndexed:
biBits = 8;
break;
case PixelFormat24bppRGB:
biBits = 24;
break;
case PixelFormat32bppRGB:
biBits = 32;
break;
}
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = pBitmap->GetWidth();
bi.biHeight = pBitmap->GetHeight();
bi.biPlanes = 1;
bi.biBitCount = biBits;
bi.biCompression = 0;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
//Get Palette size
UINT size = pBitmap->GetPaletteSize();
ColorPalette* palette = (ColorPalette*)malloc(size);
pBitmap->GetPalette(palette, size);
//Get data size
BitmapData bmd;
pBitmap->LockBits(new Rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()),
ImageLockModeRead, format, &bmd);
bi.biSizeImage = bmd.Height * bmd.Stride;
dwLen = bi.biSize + palette->Count * sizeof(RGBQUAD) + bi.biSizeImage;
hdib = GlobalAlloc(GHND,dwLen);
lpbi = (BITMAPINFOHEADER FAR *)GlobalLock(hdib);
*lpbi = bi;
memcpy(lpbi, &bi, bi.biSize);
RGBQUAD* pPal = (RGBQUAD*)((BYTE*)lpbi + bi.biSize);
// pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + palette->Count * sizeof(PALETTEENTRY));
if(size > 0)
{
// pPal->palNumEntries = palette->Count;
// pPal->palVersion = PALVERSION;
for (int i = 0; i < palette->Count; i++){
pPal[i].rgbRed = GetRValue(palette->Entries[i]);
pPal[i].rgbGreen = GetGValue(palette->Entries[i]);
pPal[i].rgbBlue = GetBValue(palette->Entries[i]);
pPal[i].rgbReserved = (BYTE)0;
}
// hpal = CreatePalette(pPal);
// LocalFree((HANDLE)pPal);
}
// PBYTE pdata = (PBYTE)(pPal + palette->Count * sizeof(RGBQUAD));
PBYTE pdata = (PBYTE)lpbi + bi.biSize + palette->Count * sizeof(RGBQUAD);
PBYTE pSrc = (PBYTE)bmd.Scan0;
for (int r = bmd.Height - 2; r >= 0; r--)
{
memcpy(pdata, pSrc + r * bmd.Stride, bmd.Stride);
pdata += bmd.Stride;
}
// memcpy(pdata, bmd.Scan0, bmd.Height * bmd.Stride);
bi = *lpbi;
GlobalUnlock(hdib);
pBitmap->UnlockBits(&bmd);
return hdib;
}
相关文章推荐
- DIB(Device-Independent Bitmap) 设备无关位图
- 三行代码实现gdi+ Bitmap对象导入资源文件位图
- 第一节:设备无关位图DIB(Device-Independent Bitmap)
- DIB(Device-Independent Bitmap,即设备无关位图)小知识
- 读取Bitmap(设备无关位图)数据的经典C代码
- device-independent bitmap (DIB) 设备无关位图
- 设备无关位图(DIB)
- 第十五章 与设备无关的位图(DIB 和 DDB 的结合2)
- 与设备无关的位图(DIB)
- 如何得到CBitmap对象加载的位图结构信息,例如长度和宽度,
- DIB--设备无关位图文件
- 依赖于设备的位图(DDB) ,CreateCompatibleBitmap用法
- 第十五章 与设备无关的位图(DIB 和 DDB 的结合2)
- 依赖于设备的位图(DDB) ,CreateCompatibleBitmap用法
- 已知一个一维数组:BYTE imageArray[width * height], 怎样在VC++2008的MFC中,用GDI+,创建一个Bitmap对象,与该数组建立关联?
- 通过图片url,得到Bitmap对象
- 与设备无关的位图一、DIB 文件格式
- 设备相关位图DDB与设备无关位图DIB
- 第十五章 与设备无关的位图(显示和打印3)
- 设备相关位图(DDB)与设备无关位图(DIB) 的区别