有关使用D2D位图画刷的问题
使用如下代码创建位图画刷,但显示的效果并不理想,位图出现很多细线,原以为是位图数据读取的有问题,但位图保存下来看又是正确的,不知道有人有没有像小弟这样使用过,分不多,望前辈们赐教
//获取位图数据
BYTE* GetBmpBits(HBITMAP hBitmap, long* size)
{
HDC hDC;
int iBits;
WORD wBitCount;
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
BITMAP Bitmap;
BITMAPINFOHEADER bi;
BITMAPFILEHEADER bmfHdr;
HANDLE hPal;
HPALETTE hOldPal=NULL;
BYTE *pBits = NULL;
//定义文件,分配内存句柄,调色板句柄
//计算位图文件每个像素所占bit位数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else
wBitCount = 24;
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD);
//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal=SelectPalette(hDC,(HPALETTE)hPal,FALSE);
RealizePalette(hDC);
}
pBits = new BYTE[dwBmBitsSize];
// 获取该调色板下新的像素值
if(0==GetDIBits(hDC,hBitmap,0,(UINT)Bitmap.bmHeight,pBits,
(BITMAPINFO *)&bi,DIB_RGB_COLORS))
{
delete[] pBits;
return NULL;
}
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
*size = ((Bitmap.bmWidth*wBitCount+31)/32)*4;
return pBits;
}
D2D1_SIZE_U size;
size.height = Bitmap.bmHeight;
size.width = Bitmap.bmWidth;
D2D1_PIXEL_FORMAT pixelFormat =
{
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_IGNORE
};
FLOAT dpiX, dpiY;
m_pD2DFactory->GetDesktopDpi(&dpiX, &dpiY);
D2D1_BITMAP_PROPERTIES prop =
{
pixelFormat,
dpiX,
dpiY
};
long pitch = 0;
//保存位图查看是正确的
//SaveBitmapToFile(hBitBmp, "d:/1111.bmp");
//......省略hBitMap的打开等操作
//取位图数据
BYTE * pBits = GetBmpBits(hBitBmp, &pitch);
if(pBits!=NULL)
{
//创建ID2D1Bitmap
HRESULT hr = m_pRenderTarget->CreateBitmap( size, (LPVOID)pBits, pitch, &prop, &pD2DBitmap );
if (SUCCEEDED(hr))
{
//创建ID2D1BitmapBrush位图画刷
hr = m_pRenderTarget->CreateBitmapBrush(
pD2DBitmap,
D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_WRAP,
D2D1_EXTEND_MODE_WRAP),
&m_pBitMapBrush );
//......
//然后使用该位图画刷绘制填充多边形,位图显示效果出现很多细化线,但大致能看到一些图形的样子是正确的
}
}