您的位置:首页 > 其它

Direct2d绘制图片的问题

2012-04-25 14:12 375 查看
网上看了不少资料,其中某篇是用笔刷画的。这样做仅适用于图片可以一次贴完的情况下。
若想要贴图片的一部分 必须要用到rendertarget的 drawbimap方法。而不是用笔刷来画。

如下的函数比较符合人类适用习惯

void D2DTexture::Draw(const D2D1_RECT_F& rcDest, const D2D1_RECT_F& rcSrc)
{
//计算缩放值

//使用了默认参数,使用整张图片
D2D1_RECT_F rf= rcSrc;
if (rf.right - rf.left == 0)
{
D2D1_SIZE_F sf = m_pBitmap->GetSize();
if (sf.width == 0 || sf.height == 0)
return ;

rf.right = sf.width;
rf.bottom = sf.height;
}

/*float dstWidth = rcDest.right - rcDest.left;
float srcWidth = rf.right - rf.left;

float dstHeight = rcDest.bottom - rcDest.top;
float srcHeight = rf.bottom - rf.top;

float scaleX = dstWidth / srcWidth;
float scaleY = dstHeight / srcHeight;

// Translate for the bitmap brush.
D2D1::Matrix3x2F final,trans,scale;
trans= D2D1::Matrix3x2F::Translation(D2D1::SizeF(rcDest.left, rcDest.top));
scale=D2D1::Matrix3x2F::Scale(scaleX,scaleY);
final =  scale*trans;

m_pRenderTarget->SetTransform(final);*/

m_pRenderTarget->DrawBitmap(m_pBitmap, rcDest, 1,D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, rf);

// Demonstrate a bitmap brush.
//m_pRenderTarget->FillRectangle(&rf, m_pBitmapBrush);

//恢复transform
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
}


其中注释掉的部分是原来的实现。用在这里算是笔刷来绘制的备份吧。如果图片并不可以重复使用的话(比如用来铺地板),那么还是每次都drawbitmap比较好。

图片画刷,只是微软表明,有这个功能罢了。当然,他可以通过辐射,或者其他东西来实现很特殊的效果。这就需要摸索了。

正常情况下,用于界面的贴图,2d地图的绘制,都使用drawbitmap比较好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: