У меня есть 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, но это решение сработало.