【问题标题】:Direct2D: Convert ID2D1Image to ID2D1BitmapDirect2D:将 ID2D1Image 转换为 ID2D1Bitmap
【发布时间】:2015-09-16 01:50:33
【问题描述】:

我正在开发一个需要修改屏幕上已有内容的程序。 所以我只有一个使用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
  • 不,这会引发访问冲突。可以从 ID2D1Bitmap 转换为 ID2D1Image,因为 ID2D1Bitmap 接口继承自 ID2D1Image。但反之则不然。
  • 请分享一个代码 sn-p 你是如何创建和应用效果的。

标签: c++ image visual-c++ direct2d


【解决方案1】:

我解决了。它很脏,但它可以工作。

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;
}

【讨论】:

  • 这实际上是正确的方法(尽管有错误处理:)
猜你喜欢
  • 2017-03-26
  • 2015-04-15
  • 2023-03-08
  • 2014-12-21
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2012-11-28
  • 2020-09-17
相关资源
最近更新 更多