Как лечить альфа-прозрачность из PNG прямо в памяти? - PullRequest
0 голосов
/ 11 января 2011

Буду признателен за помощь вам, программистам низкого уровня ... Моя проблема заключается в следующем: Я хочу распечатать растровое изображение формата ARGB8888 непосредственно в видеопамять. Форма растрового изображения в порядке, проблема в альфа-канале, который я не могу понять, как использовать. Я видел код в Википедии, который перекрывает пиксели следующим образом:

CompositedPixelColor = Alpha * ForegroundPixelColor + (1 - Alpha) * BackgroundPixelColor

Где цвет изменяется от 0 до 1. Это делается для каждого канала R G B. Я копирую каждый байт каждого цвета каждого пикселя моего растрового изображения прямо в видеопамять, используя формулу выше, но я что-то упускаю, потому что цвета не выглядят хорошо

Я пытаюсь сделать что-то вроде кода, размещенного в этой теме: http://www.badadev.com/create-a-photo-editing-app/ Но здесь они не относятся к прозрачности, и это моя проблема. Thanxs!

1 Ответ

0 голосов
/ 11 января 2011

В коде, который вы разместили, альфа трактуется как значение от 0 до 1, что, конечно, не работает, если вы используете альфа-канал в качестве беззнакового символа, используйте следующее, если вы хотите сделать это в целочисленном пространстве:

unsigned short background = 0x40;
unsigned short foreground = 0xe0;
unsigned short alpha = 0xc0;
unsigned short compositedcolor = (alpha * foreground + (0xff - alpha) * background) >> 8;

обратите внимание, что, хотя это шорты, все значения должны быть 0 - 255, шорт просто необходим в качестве вычислительного пространства для продуктов типа char * char, вы также можете использовать промежуточные приведения, но я просто использовал беззнаковые типы шорт для всех, чтобы сделать его более читабельным.

...