I tried a lot of png images and all of them fade in color
Window on the left, original image on the right
HR(Tool::_IdcDevice->CreateTargetForHwnd(mainWindow, TRUE, &IdcTarget));
HR(Tool::_IdcDevice->CreateVisual(&IdcVisual));
RECT windowRect;
GetClientRect(mainWindow, &windowRect);
HR(Tool::_IdcDevice->CreateSurface(
windowRect.right - windowRect.left, windowRect.bottom - windowRect.top,
DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_ALPHA_MODE_PREMULTIPLIED,
&IdcSurface
));
HR(IdcVisual->SetContent(IdcSurface));
HR(IdcTarget->SetRoot(IdcVisual));
HR(Tool::_IdcDevice->Commit());
POINT offset;
CComPtr<IDXGISurface> _Surface_DXGI_Draw;
HR(IdcSurface->BeginDraw(
NULL, __uuidof(IDXGISurface), reinterpret_cast<void**>(&_Surface_DXGI_Draw), &offset
));
D2D1_BITMAP_PROPERTIES1 properties = { };
properties.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED);
properties.dpiX = properties.dpiY = 96;
properties.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
properties.colorContext = NULL;
HR(Tool::_D2dDeviceContext5->CreateBitmapFromDxgiSurface(
_Surface_DXGI_Draw, properties, &ExchangeChainsBitmap
));
Tool::_D2dDeviceContext5->SetTarget(ExchangeChainsBitmap);
Tool::_D2dDeviceContext5->BeginDraw();
Tool::_D2dDeviceContext5->Clear(NULL);
CComPtr<ID2D1Bitmap> img;
HR(Tool::LoadPngAsBitmap(_T("xxx"), &img));
Tool::_D2dDeviceContext5->DrawBitmap(img);
HR(Tool::_D2dDeviceContext5->EndDraw());
HR(IdcSurface->EndDraw());
HR(Tool::_IdcDevice->Commit());
//====================================================================================
HRESULT Tool::LoadPngAsBitmap(_In_ PCWSTR uri, _Outptr_ ID2D1Bitmap** bitmap)
{
HRESULT hr = S_OK;
CComPtr<IWICStream> stream;
HR(Tool::_IWICFactory2->CreateStream(&stream));
HR(stream->InitializeFromFilename(uri, GENERIC_READ));
CComPtr<IWICBitmapDecoder> decoder;
HR(Tool::_IWICFactory2->CreateDecoderFromStream(stream, NULL, WICDecodeMetadataCacheOnLoad, &decoder));
CComPtr<IWICBitmapFrameDecode> frameDecode;
HR(decoder->GetFrame(0, &frameDecode));
CComPtr<IWICFormatConverter> converter;
HR(Tool::_IWICFactory2->CreateFormatConverter(&converter));
HR(converter->Initialize(frameDecode, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeCustom));
HR(Tool::_D2dDeviceContext5->CreateBitmapFromWicBitmap(converter, NULL, bitmap));
return hr;
}
I tried to save the bitmap created by LoadPngAsBitmap back to a file and he has the correct colors. I guess the problem is related to alpha premultiplication, but I don’t know how to fix it