Преобразование ID2D1HwndRenderTarget Direct2D в ID2D1Bitmap

Мне нужно преобразовать 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 );
   

Спасибо, это ошибка при копировании. Однако проблема с ошибкой остается нерешенной.

kimton 12.07.2024 12:40

¿Являются ли ширина и высота положительными? ¿Почему используется формат пикселей D2D1_ALPHA_MODE_PREMULTIPLIED? Я не думаю, что цели рендеринга когда-либо хранят предварительно умноженную альфу. ¿А нет ли каких-либо сообщений от уровня отладки?

user7860670 12.07.2024 13:06

Спасибо! Установка альфа-режима на D2D1_ALPHA_MODE_IGNORE сработала отлично! Ширина и высота такие же, как цель рендеринга и размер пикселя. Правильно. Однако было странно использовать что-то другое, поэтому я это исправил.

kimton 12.07.2024 15:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Цель рендеринга 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();

kimton 12.07.2024 15:21

Другие вопросы по теме

Похожие вопросы