ID2D1HwndRenderTarget :: CreateBitmapFromWicBitmap()

避免

我正在尝试使用WIC从文件中加载图片并在Direct2D上将其显示在屏幕上。我遵循MSDN示例,但是函数CreateBitmapFromWicBitmap()遇到问题。

无论我在创建和函数调用期间使用哪种像素格式组合,函数都将返回0x88982f80错误()。ID2D1HwndRenderTargetIWICFormatConverter::Initialize()CreateBitmapFromWicBitmap()WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT

ID2D1HwndRenderTarget使用与绘图相同的函数来调用该函数我应该创建另一个渲染目标吗?

在此链接的评论部分,有人写CreateBitmapFromWicBitmap()了DXGI表面渲染目标应调用它。这是否意味着该功能根本无法使用ID2D1HwndRenderTarget

编辑:

void LoadBitmapFromFile(ID2D1HwndRenderTarget* target, ID2D1Bitmap** ppBitmap)
{
    IWICImagingFactory* factory;
    IWICBitmapDecoder* decoder;
    IWICBitmapFrameDecode* frame;
    IWICFormatConverter* converter;

    CoInitializeEx(0, COINIT_MULTITHREADED);
    CoCreateInstance(CLSID_WICImagingFactory1,
                     NULL,
                     CLSCTX_INPROC_SERVER,
                     IID_IWICImagingFactory,
                     reinterpret_cast<void**>(&factory));

    factory->CreateDecoderFromFilename(L".png",
                                       NULL,
                                       GENERIC_READ,
                                       WICDecodeMetadataCacheOnLoad,
                                       &decoder);

    decoder->GetFrame(0, &frame);

    factory->CreateFormatConverter(&converter);

    converter->Initialize(frame,
                          GUID_WICPixelFormat32bppPBGRA,
                          WICBitmapDitherTypeNone,
                          NULL,
                          0.f,
                          WICBitmapPaletteTypeMedianCut);

    target->CreateBitmapFromWicBitmap(frame, 0, ppBitmap);
}

这样创建ID2D1HwndRenderTarget:

ID2D1Factory* factory;
ID2D1HwndRenderTarget* target;

D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);

factory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_HARDWARE,
                                 D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)), 
    D2D1::HwndRenderTargetProperties(hwnd, D2D1::SizeU(width, height)),
    &target);
巴马克·谢米拉尼(Barmak Shemirani)

CreateBitmapFromWicBitmap期望converter作为第一个参数,而不是frame

使用CLSID_WICImagingFactory代替CLSID_WICImagingFactory1编译器将选择正确的值。就我而言CLSID_WICImagingFactory2

的变量名称IWICImagingFactory* factory隐藏了具有相同名称的全局变量。这可能不是引起错误,但最好将其更改...

需要释放手柄。

HRESULT LoadBitmapFromFile(const wchar_t *filename, ID2D1HwndRenderTarget* target, ID2D1Bitmap** pBitmap)
{
    HRESULT hr = S_FALSE;
    IWICImagingFactory* wic_factory = NULL;
    IWICBitmapDecoder* decoder = NULL;
    IWICBitmapFrameDecode* frame = NULL;
    IWICFormatConverter* converter = NULL;

    hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, reinterpret_cast<void**>(&wic_factory));
    if FAILED(hr) goto clenaup;

    hr = wic_factory->CreateDecoderFromFilename(filename, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &decoder);
    if FAILED(hr) goto clenaup;

    hr = decoder->GetFrame(0, &frame);
    if FAILED(hr) goto clenaup;

    hr = wic_factory->CreateFormatConverter(&converter);
    if FAILED(hr) goto clenaup;

    hr = converter->Initialize(frame, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut);
    if FAILED(hr) goto clenaup;

    hr = target->CreateBitmapFromWicBitmap(converter, 0, pBitmap);
    if FAILED(hr) goto clenaup;

clenaup:
    safe_release(decoder);
    safe_release(converter);
    safe_release(frame);
    safe_release(wic_factory);
    return hr;
}

CoInitializeEx(0, COINIT_MULTITHREADED) 可以在初始化中被调用一次。

ID2D1Factory* factory;
ID2D1HwndRenderTarget* target;

void initialize(HWND hwnd)
{
    CoInitializeEx(0, COINIT_MULTITHREADED);

    RECT rc;
    GetClientRect(hwnd, &rc);

    D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);
    factory->CreateHwndRenderTarget(
        D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_HARDWARE,
        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)),
        D2D1::HwndRenderTargetProperties(hwnd, D2D1::SizeU(rc.right, rc.bottom)),
        &target);
}

void on_render()
{
    target->BeginDraw();
    target->Clear(D2D1::ColorF(D2D1::ColorF::White));

    ID2D1Bitmap* pBitmap = NULL;
    if (SUCCEEDED(LoadBitmapFromFile(L"filename.png", target, &pBitmap)))
    {
        D2D1_SIZE_F size = pBitmap->GetSize();
        target->DrawBitmap(pBitmap, D2D1::RectF(0, 0, size.width, size.height));
        safe_release(pBitmap);
    }

    target->EndDraw();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ID2D1HwndRenderTarget始终具有黑色背景而不是透明背景

来自分类Dev

强制Win32公共控件使用“ ID2D1HwndRenderTarget”?

来自分类Dev

Direct2d ID2D1HwndRenderTarget-> GetSize()返回零

来自分类Dev

ID2D1Bitmap1 :: Map问题

来自分类Dev

从 .bmp 文件加载 ID2D1Bitmap

来自分类Dev

投射正确性-将ID2D1Brush转换为ID2D1SolidColorBrush(DirectX)

来自分类Dev

从ID3D11Texture2D到ID2D1Bitmap,可以吗?

来自分类Dev

绘制矩形后ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE

来自分类Dev

绘制矩形后ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE

来自分类Dev

2D ID数组和1D权重的加权numpy bincount

来自分类Dev

将ID2D1Effect输出存储在ID2D1Bitmap / Image中以在以后绘制它吗?

来自分类Dev

从行ID = 2更新行ID = 1

来自分类Dev

Direct2D:如何将ID2D1RenderTarget的内容保存到图像文件?

来自分类Dev

如何知道ID2D1Brush是哪种类型的电刷?

来自分类Dev

How to convert a image file loaded in memory to a ID2D1Bitmap in C++

来自分类Dev

创建ID2D1RenderTerget时出现问题

来自分类Dev

重新呈现时水平翻转ID2D1Bitmap

来自分类Dev

调用ID2D1RenderTarget :: DrawTextLayout()不起作用

来自分类Dev

ID2D1RenderTarget::GetSize 返回物理像素而不是 DIP

来自分类Dev

将24位BGR图像从内存加载到ID2D1Bitmap1的最佳方法

来自分类Dev

如何在C ++中将内存中加载的图像文件转换为ID2D1Bitmap

来自分类Dev

在Python中将元组('Id','row 1'),('Id','row 2')的集合转换为List ['Id',['row 1','row2']

来自分类Dev

下铸ID3D11Texture2D

来自分类Dev

来自ID3D11Texture2D的HBitmap

来自分类Dev

锚替换为'#id1','#id2','#id3'... Sphinx

来自分类Dev

CakePHP:如何发送$ _GET参数,例如id [] = 1&id [] = 2&id [] = 3

来自分类Dev

git diff中的“ index f2e4113..d4b9bfc 100644”如何对应于gitk中的SHA1 ID?

来自分类Dev

git diff中的“ index f2e4113..d4b9bfc 100644”如何对应于gitk中的SHA1 ID?

来自分类Dev

从表1获取ID以与表2匹配

Related 相关文章

  1. 1

    ID2D1HwndRenderTarget始终具有黑色背景而不是透明背景

  2. 2

    强制Win32公共控件使用“ ID2D1HwndRenderTarget”?

  3. 3

    Direct2d ID2D1HwndRenderTarget-> GetSize()返回零

  4. 4

    ID2D1Bitmap1 :: Map问题

  5. 5

    从 .bmp 文件加载 ID2D1Bitmap

  6. 6

    投射正确性-将ID2D1Brush转换为ID2D1SolidColorBrush(DirectX)

  7. 7

    从ID3D11Texture2D到ID2D1Bitmap,可以吗?

  8. 8

    绘制矩形后ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE

  9. 9

    绘制矩形后ID2D1DeviceContext EndDraw D2DERR_WRONG_STATE

  10. 10

    2D ID数组和1D权重的加权numpy bincount

  11. 11

    将ID2D1Effect输出存储在ID2D1Bitmap / Image中以在以后绘制它吗?

  12. 12

    从行ID = 2更新行ID = 1

  13. 13

    Direct2D:如何将ID2D1RenderTarget的内容保存到图像文件?

  14. 14

    如何知道ID2D1Brush是哪种类型的电刷?

  15. 15

    How to convert a image file loaded in memory to a ID2D1Bitmap in C++

  16. 16

    创建ID2D1RenderTerget时出现问题

  17. 17

    重新呈现时水平翻转ID2D1Bitmap

  18. 18

    调用ID2D1RenderTarget :: DrawTextLayout()不起作用

  19. 19

    ID2D1RenderTarget::GetSize 返回物理像素而不是 DIP

  20. 20

    将24位BGR图像从内存加载到ID2D1Bitmap1的最佳方法

  21. 21

    如何在C ++中将内存中加载的图像文件转换为ID2D1Bitmap

  22. 22

    在Python中将元组('Id','row 1'),('Id','row 2')的集合转换为List ['Id',['row 1','row2']

  23. 23

    下铸ID3D11Texture2D

  24. 24

    来自ID3D11Texture2D的HBitmap

  25. 25

    锚替换为'#id1','#id2','#id3'... Sphinx

  26. 26

    CakePHP:如何发送$ _GET参数,例如id [] = 1&id [] = 2&id [] = 3

  27. 27

    git diff中的“ index f2e4113..d4b9bfc 100644”如何对应于gitk中的SHA1 ID?

  28. 28

    git diff中的“ index f2e4113..d4b9bfc 100644”如何对应于gitk中的SHA1 ID?

  29. 29

    从表1获取ID以与表2匹配

热门标签

归档