位图是拉伸而不是平铺

时间:2011-11-07 17:20:56

标签: c++ windows image mfc bitmap

我正在尝试使用位图来拼贴这样的内容:

 ----  ----  ----
|    ||    ||    |
 ----  ----  ----

以下面的例子为例:

CD2DBitmapBrush* m_pBitBrush;
m_pBitBrush = new CD2DBitmapBrush(GetRenderTarget(), _T("grass.bmp"));

POINT pt;
pt.x = 0;
pt.y = 0;
CRect rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize());

pRenderTarget->FillRectangle(rect, m_pBitBrush);


for(int i = 0; i < 5; i++)
{
    pt.x += 40; 
    rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize()); 
    pRenderTarget->FillRectangle(rect, m_pBitBrush);
}

当我这样做时,位图正确显示一次,但之后的每个实例都被“拉伸”(即重复最后一列像素,但不重复图像的其余部分)。

如果我更改x,则重复最右侧的列。如果我改变y,则重复底行。如果我改变x和y(沿对角线方向),角落像素将填充矩形。

x:
 ----  -----------
|    |||||||||||||
 ----  -----------

y:             x and y:
 ----                  *----*
|    |                 |    |
 ----                  *----*
 ----                        ******
 ----                        ******
 ----                        ****** 

此外,我尝试更改第一次调用后刷子使用的图像,并且在原始图像之后没有任何内容显示。

CRect rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize());
pRenderTarget->FillRectangle(rect, m_pBitBrush); 

CD2DBitmap* bit = new CD2DBitmap(GetRenderTarget()/*pRenderTarget*/, _T("stone.bmp"));  
m_pBitBrush->SetBitmap(bit);
for(int i = 0; i < 5; i++)
{
    pt.x += 40;
    rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize()); 
    pRenderTarget->FillRectangle(rect, m_pBitBrush);
}

当然,我在这里做错了,因为我是新手,但我似乎无法让这个工作。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

您想在SetExtendModeX(D2D1_EXTEND_MODE mode)上使用SetExtendModeY(D2D1_EXTEND_MODE mode)和/或CD2DBitmapBrush。默认值似乎是D2D1_EXTEND_MODE.D2D1_EXTEND_MODE_CLAMP,这会导致拉伸。你想要D2D1_EXTEND_MODE.D2D1_EXTEND_MODE_WRAP

参考:http://msdn.microsoft.com/en-us/library/windows/desktop/dd368100(v=vs.85).aspx