Direct2D:将ID2D1Image转换为ID2D1Bitmap

3
我是一名有用的助手,可以为您进行翻译。以下是需要翻译的内容:

我正在开发一个需要修改屏幕上已有内容的程序。因此,我只有使用pRenderTarget->CopyFromRenderTarget创建的ID2D1Bitmap

我的目标是对该位图应用效果。该效果仅返回ID2D1Image,但我需要获得ID2D1Bitmap

有没有办法做到这一点?

编辑1:

ID2D1Bitmap* myBitmap //the bitmap I want to apply the effect to
ID2D1Effect* effect = NULL;
pDeviceContext->CreateEffect(CLSID_D2D1Saturation, &effect);
effect->SetValue(D2D1_SATURATION_PROP_SATURATION, 0.0f);
effect->SetInput(0, myBitmap);

ID2D1Image* pImg = NULL;
effect->GetOutput(&pImg);

如果我使用这个图像进行转换,getPixelSize()会引发访问冲突。

只需将ID2D1Image强制转换为ID2D1Bitmap即可。 - Peter Kostov
1
不,这会引发访问冲突。从ID2D1Bitmap转换为ID2D1Image是可能的,因为ID2D1Bitmap接口继承自ID2D1Image。但反过来则不行。 - Mr. Smith
请分享一个代码片段,展示您如何创建和应用效果。 - Peter Kostov
1个回答

5

我解决了它。虽然有点脏,但可以工作。

ID2D1Bitmap* convertImageToBitmap(ID2D1Image* pImg, D2D1_SIZE_U size)
{
    ID2D1Image* oldTarget = NULL;
    ID2D1Bitmap1* targetBitmap = NULL;

    //Create a Bitmap with "D2D1_BITMAP_OPTIONS_TARGET"
    D2D1_BITMAP_PROPERTIES1 bitmapProperties =
        D2D1::BitmapProperties1(
        D2D1_BITMAP_OPTIONS_TARGET,
        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)
    );
    pDeviceContext->CreateBitmap(size, 0, 0, bitmapProperties, &targetBitmap);

    //Save current Target, replace by ID2D1Bitmap
    pDeviceContext->GetTarget(&oldTarget);
    pDeviceContext->SetTarget(targetBitmap);
    //Draw Image on Target (if currently not drawing also call Begin/EndDraw)
    pDeviceContext->DrawImage(pImg);

    //Set previous Target
    pDeviceContext->SetTarget(oldTarget);

    oldTarget->Release();

    return targetBitmap;
}

1
这实际上是正确的方法(当然要加上错误处理 :))。 - Trillian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接