Есть ли у кого-нибудь оптимизированная функция для предварительного умножения растрового изображения на альфа?

Функции смешивания GDIPlus для эффективности используют предварительно умноженный канал RGB на альфа-битовые карты. Однако предварительное умножение на альфа очень затратно, так как вам нужно обрабатывать каждый пиксель один за другим.

Вроде бы хороший кандидат на сборку SSE. Есть ли здесь кто-нибудь, кто хотел бы поделиться его реализацией? Я знаю, что это тяжелая работа, поэтому и спрашиваю. Я не пытаюсь украсть твою работу. Вы получите все мое внимание, если поделитесь этим, если сможете.

Изменить: я не пытаюсь выполнять альфа-смешение программным обеспечением. Я пытаюсь предварительно умножить каждый цветовой компонент каждого пикселя изображения на его альфа-канал. Я делаю это, потому что альфа-смешение выполняется по формуле: dst = src src.alpha + dst (1-dst.alpha), однако функция AlphaBlend Win32 действительно реализует dst = src + dst ( 1-dst.alpha) для оптимизации. Чтобы получить правильный результат, вам нужно, чтобы src было равно src * src.alpha перед вызовом AlphaBlend.

Мне бы потребовалось немного времени, чтобы написать, поскольку я мало знаю о сборке, поэтому я спросил, не хочет ли кто-нибудь поделиться ее реализацией. SSE был бы великолепен, так как в статье выигрыш при альфа-смешивании программным обеспечением составляет 300%.


person Emmanuel Caradec    schedule 17.04.2009    source источник
comment
Вам следует попробовать GDI. Вы можете предварительно умножить альфа растрового изображения, используя DIB (в памяти). Это очень быстро. stackoverflow.com/ questions / 307348 /   -  person dns    schedule 13.08.2015


Ответы (3)


Здесь есть хорошая статья. Это немного устарело, но вы можете найти что-то полезное в разделе, где он использует MMX для реализации альфа-смешивания. Это можно легко преобразовать в инструкции SSE, чтобы воспользоваться преимуществами регистров большего размера (128 бит).

Расширенное альфа-смешение MMX

Примечания по применению Intel здесь, с исходным кодом

Использование инструкций MMX ™ для реализации альфа-смешивания

person Indy9000    schedule 17.04.2009

Вы можете ознакомиться с библиотекой шаблонов C ++ Eigen. Он позволяет использовать код C ++ высокого уровня, который использует оптимизированный ассемблер с поддержкой SSE / Altivec.

Быстрый. (См. Тест).
Шаблоны выражений позволяют разумно удалять временные объекты и включать ленивую оценку, когда это уместно - Eigen заботится об этом автоматически и в большинстве случаев обрабатывает псевдонимы. Явная векторизация выполняется для наборов инструкций SSE (2 и новее) и AltiVec с постепенным откатом к невекторизованному коду. Шаблоны выражений позволяют выполнять эту оптимизацию глобально для целых выражений. С объектами фиксированного размера избегается динамическое выделение памяти, и циклы разворачиваются, когда это имеет смысл. Для больших матриц особое внимание уделяется удобству кеширования.

Элегантный. (См. Пример API).
API чрезвычайно чистый и выразительный благодаря шаблонам выражений. Реализация алгоритма поверх Eigen похожа на копирование псевдокода. Вы можете использовать сложные выражения и по-прежнему полагаться на Eigen для создания оптимизированного кода: вам не нужно вручную разлагать выражения на небольшие шаги.

person lothar    schedule 17.04.2009

Обработка каждого пикселя обходится недорого с помощью встроенного API Win32 GDI.
См. MSDN

person Community    schedule 17.04.2009