有关使用D2D位图画刷的问题

freeygz 2011-07-26 01:44:34
使用如下代码创建位图画刷,但显示的效果并不理想,位图出现很多细线,原以为是位图数据读取的有问题,但位图保存下来看又是正确的,不知道有人有没有像小弟这样使用过,分不多,望前辈们赐教

//获取位图数据
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 );
//......
//然后使用该位图画刷绘制填充多边形,位图显示效果出现很多细化线,但大致能看到一些图形的样子是正确的
}
}
...全文
325 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCT1990 2011-07-28
  • 打赏
  • 举报
回复
你用画刷的时候是不是缩小了一百倍左右啊,如果是这样的话肯定就出现这种效果了,我目前也遇到这种问题,ID2D1Bitmap缩小后失真,一条直线断断续续,我想唯一解决的办法就是从ID2D1Bitmap中获得数据创建一个BITMAP然后绘制会正常。
freeygz 2011-07-27
  • 打赏
  • 举报
回复
自己顶一下
freeygz 2011-07-27
  • 打赏
  • 举报
回复
自己解决了,结贴
freeygz 2011-07-26
  • 打赏
  • 举报
回复
貌似现在使用D2D的人很少,郁闷啊!

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧