Как сохранить ID2D1Bitmap в файл с помощью WIC?

У меня проблема с сохранением растрового изображения в файл. я использую Как сохранить ID2D1Bitmap в файл PNG в качестве ссылки, но у меня есть другая ошибка, чем та, которая была опубликована в этом.

Я получаю сообщение об ошибке 0x88990015 HRESULT, что означает: использованный ресурс был создан целью рендеринга в другом домене ресурсов.

Вот мой код:

void Wnd::SavePng(LPCWSTR Path,ID2D1Bitmap* pBit) {
CComPtr<ID2D1RenderTarget> pRT;
CComPtr<IWICBitmap> pB;
CComPtr<IWICBitmapEncoder> pEncoder;
CComPtr<IWICBitmapFrameEncode> pFrame;
CComPtr<IWICStream> pStream;

WICPixelFormatGUID format = GUID_WICPixelFormat32bppPBGRA;
HRESULT Hr = m_pWICFactory->CreateBitmap(pBit->GetSize().width,pBit->GetSize().height,format,WICBitmapCacheOnLoad,&pB);

if (SUCCEEDED(Hr)) {
D2D1_RENDER_TARGET_PROPERTIES RTProps = RenderTargetProperties();
RTProps.pixelFormat = PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED);
Hr = m_pDirect2dFactory->CreateWicBitmapRenderTarget(pB,&RTProps,&pRT);
}

if (SUCCEEDED(Hr)) {
pRT->BeginDraw();
pRT->Clear();
pRT->DrawBitmap(pBit);
Hr = pRT->EndDraw();
}

if (SUCCEEDED(Hr)) {
Hr = m_pWICFactory->CreateStream(&pStream);
}

if (SUCCEEDED(Hr)) {
Hr = pStream->InitializeFromFilename(Path,GENERIC_WRITE);
}

if (SUCCEEDED(Hr)) {
Hr = m_pWICFactory->CreateEncoder(GUID_ContainerFormatPng,NULL,&pEncoder);
}

if (SUCCEEDED(Hr)) {
Hr = pEncoder->Initialize(pStream,WICBitmapEncoderNoCache);
}

if (SUCCEEDED(Hr)) {
Hr = pEncoder->CreateNewFrame(&pFrame,NULL);
}

if (SUCCEEDED(Hr)) {
Hr = pFrame->Initialize(NULL);
}

if (SUCCEEDED(Hr)) {
Hr = pFrame->SetSize(pBit->GetSize().width,pBit->GetSize().height);
}

if (SUCCEEDED(Hr)) {
Hr = pFrame->SetPixelFormat(&format);
}

if (SUCCEEDED(Hr)) {
Hr = pFrame->WriteSource(pB,NULL);
}

if (SUCCEEDED(Hr)) {
Hr = pFrame->Commit();
}

if (SUCCEEDED(Hr)) {
Hr = pEncoder->Commit();
}
}

Я понимаю, что вы не можете использовать ресурсы, сделанные другой фабрикой, с другой, но должен быть способ сделать эту работу.

1

Решение

Ваше понимание близости ресурсов недостаточно. Ресурсы зависят от устройства, а не от фабрики. Да, они также имеют тенденцию быть специфичными для фабрики, но ключом является специфика устройства.

В вашем примере вы передаете растровое изображение, созданное другой целью рендеринга, которое затем передаете методу DrawBitmap другой цели рендеринга. Вы можете нарисовать только растровое изображение, созданное той же целью рендеринга. Это гарантирует, что растровое изображение и цель рендеринга (источник и цель) находятся в одном домене ресурсов (адресное пространство).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]