Как вы можете нарисовать 32bppargb изображения с функцией Win32 AlphaBlend? - PullRequest
0 голосов
/ 15 января 2010

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

Я обнаружил, что GDI + DrawImage в C # слишком медленный для того, что я пытаюсь визуализировать, и, судя по форумам, он одинаков для других людей.

Я решил, что попробую использовать AlphaBlend или BitBlt из Win32 API для повышения производительности. В любом случае, мои изображения отображаются нормально, за исключением одной маленькой детали - независимо от того, какой формат изображения я использую, я не могу заставить белый фон исчезать из моей (прозрачной) графики.

До сих пор я пробовал форматы BMP и PNG и убедился, что они загружаются как изображения 32bppargb в C #.

Вот звонок, который я делаю:

// Draw the tile to the screen.
Win32GraphicsInterop.AlphaBlend(graphicsCanvas, destination.X, destination.Y, this.TileSize, this.TileSize,
                                this.imageGraphicsPointer, tile.UpperLeftCorner.X, tile.UpperLeftCorner.Y,
                                this.TileSize, this.TileSize,
                                new Win32GraphicsInterop.BLENDFUNCTION(Win32GraphicsInterop.AC_SRC_OVER, 0,
                                                                                   Convert.ToByte(opacity * 255),
                                                                                   Win32GraphicsInterop.AC_SRC_ALPHA));

Для записи, AC_SRC_OVER - это 0x00, а AC_SRC_ALPHA - это 0x01, что согласуется с тем, что MSDN говорит, что они должны быть.

Кто-нибудь из вас, ребята, имеет хорошее решение этой проблемы или знает лучший (но все же быстрый) способ, которым я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 15 января 2010

Graphics.DrawImage () скорость критически зависит от формата пикселей. Format32bppPArgb в 10 раз быстрее, чем любой другой на любой недавней машине, которую я пробовал.

Также убедитесь, что размер изображения не изменяется, обязательно используйте перегрузку DrawImage (), которая устанавливает размер назначения, равный размеру растрового изображения. Очень важно, если настройка DPI видеоадаптера не соответствует разрешению растрового изображения.

1 голос
/ 15 января 2010

Хорошо. С чистой точки зрения Win32:

Для того, чтобы AlphaBlend действительно альфа-смесь ... ему нужно, чтобы контекст исходного устройства содержал выбранный HBITMAP, представляющий изображение с растровым изображением 32bpp с предварительно умноженным альфа-каналом. Чтобы получить растровое изображение устройства с 32bpp, вы можете либо вызвать одну из многих функций, которые создадут растровое изображение, совместимое с экраном, и надеяться, что, черт возьми, пользователь выбрал 32bpp в качестве разрядности рабочего стола. ИЛИ, убедитесь, что исходное растровое изображение является DIBSection. Ну, библиотека или фреймворк, который создает его из загруженного изображения для вас.

Итак, C # загружает ваши изображения с 32bpp argb, НО, как вы преобразуете это C # представление растрового изображения в HBITMAP? Вам необходимо убедиться, что создается раздел DIB, а не DDB (или зависящее от устройства растровое изображение), и что раздел DIB равен 32 бит / с.

1 голос
/ 15 января 2010

Пробовали ли вы непрозрачность всего 255, а не расчетную?

В этом блоге описывается, что вы пытаетесь сделать:выполняет преобразование изображения для совместимости альфа-канала.

...