【发布时间】:2015-04-17 07:42:00
【问题描述】:
有没有人知道如何“克隆”位图(ID2D1Bitmap)。
我想克隆位图的一部分,并让它具有原始的所有相同属性(DPI、分辨率等),唯一不同的是大小。 Gdiplus有一个我想模拟的克隆功能。
谢谢
我最初是从这个开始的
CComPtr<ID2D1Bitmap> imageD;
// if region is entire original image no need to create a cropped image
if (left != 0 || top != 0 || right != imageSize.width || bottom != imageSize.height)
{
// get format of original image
D2D1_PIXEL_FORMAT fmt = imageData.image->GetPixelFormat();
D2D1_SIZE_U bitmapPixelSize = D2D1::SizeU((UINT)(right - left), (UINT)(bottom - top));
// create destination image of "clipped" source image
HRESULT hr = m_pRenderTarget->CreateBitmap(bitmapPixelSize, D2D1::BitmapProperties(
D2D1::PixelFormat(fmt.format, fmt.alphaMode),
(float)imageData.resX, (float)imageData.resY), &imageD);
if (hr != S_OK)
{
return;
}
D2D1_POINT_2U topleft = D2D1::Point2U(0, 0);
D2D1_RECT_U srcRect = D2D1::RectU((UINT)left, (UINT)top, (UINT)right, (UINT)bottom);
// get the "clipped" source
hr = imageD->CopyFromBitmap(&topleft, imageData.image, &srcRect);
if (hr != S_OK)
{
return;
}
imageSize = imageD->GetPixelSize();
}
else
imageD = imageData.image;
// create a textured brush w/ wrapping capabilities
CComPtr <ID2D1BitmapBrush> pFabricBitmapBrush;
HRESULT hr = m_pRenderTarget->CreateBitmapBrush(imageD, &pFabricBitmapBrush);
pFabricBitmapBrush->SetExtendModeX(D2D1_EXTEND_MODE_WRAP);
pFabricBitmapBrush->SetExtendModeY(D2D1_EXTEND_MODE_WRAP);
如您所见,我将新的(裁剪的)位图用作画笔。当我这样做时,画笔本身会绘制一个较小的图像,使用带有 Gdiplus 的“克隆”API,逻辑会正确绘制。这就是让我想到 Direct2d“副本”没有给我与原始图像相同的属性的想法。
这似乎有效。分辨率、DPI、尺寸等 - 必须仔细阅读。
float dpiXs, dpiYs;
imageData.image->GetDpi(&dpiXs, &dpiYs);
D2D1_SIZE_U bitmapPixelSize = D2D1::SizeU((UINT)(right - left), (UINT)(bottom - top));
// create destination image of "clipped" source image
HRESULT hr = m_pRenderTarget->CreateBitmap(bitmapPixelSize, D2D1::BitmapProperties(
D2D1::PixelFormat(fmt.format, fmt.alphaMode), dpiXs, dpiYs), &imageD);
【问题讨论】: