Мне нужно преобразовать Direct2D ID2D1HwndRenderTarget в ID2D1Bitmap. Однако я столкнулся с ошибкой CopyFromRenderTarget. «Ошибка: E_INVALIDARG Один или несколько аргументов недопустимы».
В чем может быть проблема?
использование Direct2D 1.0 (включая d2d1.h)
HRESULT hr;
ID2D1Factory* factory;
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);
ID2D1HwndRenderTarget* target;
D2D1_RENDER_TARGET_PROPERTIES prop{ D2D1::RenderTargetProperties() };
factory->CreateHwndRenderTarget(prop,D2D1::HwndRenderTargetProperties(hwnd,
D2D1::SizeU(static_cast<UINT>(width), static_cast<UINT>(height))), target);
// ID2D1HwndRenderTarget* target
HRESULT hr;
D2D1_SIZE_F size = target->GetSize();
UINT width = static_cast< UINT >( size.width );
UINT height = static_cast< UINT >( size.height );
D2D1_SIZE_U px_size = target->GetPixelSize();
D2D1_BITMAP_PROPERTIES props;
bitmapProperties.pixelFormat = D2D1::PixelFormat( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED );
bitmapProperties.dpiX = 96.0f;
bitmapProperties.dpiY = 96.0f;
ID2D1Bitmap* src_bitmap;
hr = target->CreateBitmap( px_size, NULL, 0, &props, &src_bitmap );
// Copy the contents of the current drawing target to a bitmap
D2D1_POINT_2U destPoint = D2D1::Point2U( 0, 0 );
D2D1_RECT_U srcRect = D2D1::RectU( 0, 0, px_size.width, px_size.height );
// Error: E_INVALIDARG One or more arguments are invalid.
hr = src_bitmap->CopyFromRenderTarget( &destPoint, target, &srcRect );
¿Являются ли ширина и высота положительными? ¿Почему используется формат пикселей D2D1_ALPHA_MODE_PREMULTIPLIED
? Я не думаю, что цели рендеринга когда-либо хранят предварительно умноженную альфу. ¿А нет ли каких-либо сообщений от уровня отладки?
Спасибо! Установка альфа-режима на D2D1_ALPHA_MODE_IGNORE сработала отлично! Ширина и высота такие же, как цель рендеринга и размер пикселя. Правильно. Однако было странно использовать что-то другое, поэтому я это исправил.
Цель рендеринга HWND Direct2D поддерживает различные форматы пикселей. Когда вы создаете его так, как вы (передавая D2D1::RenderTargetProperties()
), вы неявно используете параметры DXGI_FORMAT_B8G8R8A8_UNORM
+ D2D1_ALPHA_MODE_IGNORE
.
Таким образом, вы можете либо изменить способ создания цели рендеринга (вы можете использовать D2D1_ALPHA_MODE_PREMULTIPLIED
) и не менять формат пикселей растрового изображения, либо изменить формат пикселей растрового изображения на D2D1_ALPHA_MODE_IGNORE
.
Но лучше всего просто скопировать формат пикселей цели рендеринга следующим образом:
D2D1_BITMAP_PROPERTIES bitmapProperties{}; // use 0 for dpi means auto-adapt
bitmapProperties.pixelFormat = target->GetPixelFormat();
Спасибо! Это сработало отлично. Кажется, этот код помогает предотвратить ошибки. >target->GetPixelFormat();
Спасибо, это ошибка при копировании. Однако проблема с ошибкой остается нерешенной.