Отразить ID2D1Bitmap по горизонтали при отрисовке - PullRequest
1 голос
/ 29 мая 2020

У меня есть Direct2D ID2D1Bitmap, который я отображаю с помощью ID2D1HwndRenderTarget :: DrawBitmap (). Я пытаюсь перевернуть изображение по горизонтали.

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

Я вижу ссылки на использование IWICBitmapFlipRotator , но IWICBitmapFlipRotator :: Initialize () принимает IWICBitmapSource, а не ID2D1Bitmap. (Я почти уверен, что у меня было растровое изображение WI C в IWICFormatConverter, когда изображение было впервые загружено, но я не могу позволить себе сохранить объекты WI C для ~ 100 загруженных изображений. И мне нужно только время от времени переворачивайте изображения.)

Я видел примеры использования матрицы преобразования, которая выглядит многообещающей и была бы отличным вариантом (я уже применяю преобразование D2D1 :: Matrix3x2F :: Rotation ()), однако на экране ничего не отображается. отображение, когда я применяю это преобразование.

D2D1_MATRIX_3X2_F flip = D2D1::Matrix3x2F(-1, 0, 0, 1, 0, 0);
m_pTarget->SetTransform(flip);
m_pTarget->DrawBitmap(pBitmap, ...);

Я видел несколько ссылок на D2D1_ORIENTATION_FLIP_HORIZONTAL, но не было примеров того, как его использовать.

Я, очевидно, новичок в Direct2D. Спасибо за вашу помощь!

ОБНОВЛЕНИЕ: Я обнаружил, что приведенный выше код Matrix3x2F (-1, 0, 0, 1, 0, 0) действительно переворачивает (так называемое «зеркало») изображение при визуализации по горизонтали. Однако он также сдвигает изображение влево, чтобы его не было видно. Чтобы отрегулировать это, я также применяю Matrix3x2F :: Translation (xShift, 0) для изменения положения растрового изображения. Я определяю значение xShift с помощью запутанной (также известной как «хромой», «фальшивой», «смущающей») формулы, которая основана на предполагаемом расположении растрового изображения и ширине растрового изображения. Я уверен, что есть более чистый способ выполнить требуемый сдвиг оси x, но это решение сработало.

Ответы [ 2 ]

0 голосов
/ 23 августа 2020

Используйте D2D1 :: Matrix3x2F (-1.f, 0.f, 0.f, 1.f, xShift, 0.f)

0 голосов
/ 09 июня 2020

Я обнаружил, что приведенный выше код Matrix3x2F (-1, 0, 0, 1, 0, 0) действительно переворачивает по горизонтали (так называемое «зеркало») изображение при рендеринге. Однако он также сдвигает изображение влево, чтобы его не было видно. Чтобы отрегулировать это, я также применяю Matrix3x2F :: Translation (xShift, 0) для изменения положения растрового изображения. Я определяю значение xShift с помощью запутанной (также известной как «хромой», «фальшивой», «смущающей») формулы, которая основана на предполагаемом расположении растрового изображения и ширине растрового изображения. Я уверен, что есть более чистый способ выполнить требуемый сдвиг оси x, но это решение сработало.

...