Здравствуйте,
работая с графикой в Hiasm обнаружил, что наложение изображения поверх другого с использованием альфа-канала происходит некорректно.
Выложил http://forum.hiasm.com/forum_serv.php?q=56&id=2071 с демонстрацией разницы работы альфа-канала в Hiasm и Фотошопе.
Если я неправ, растолкуйте.
Этот топик читают: Гость
Ответов: 49
Рейтинг: 11
|
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
vovcheck писал(а): в Hiasm и ФотошопеНашел что сравнить -- Фотошоп и HiAsm. То, что может делать Фотошоп, никогда не сможет делать HiAsm, по крайней мере, пакет Windows |
|||
карма: 22 |
|
Ответов: 49
Рейтинг: 11
|
|||
Я не собираюсь сопоставлять их графические возможности. За 27 лет моей работы с графикой понятие Alpha всегда определялось как степень прозрачности. Здесь же Alpha смешивается с RGB, а затем уже накладывается. В моем примере это видно по состоянию нижней левой четверти, т.е. происходит наложение тех пиксел, у которых Alpha=0. Разве это корректно?
|
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
vovcheck писал(а): Здесь же Alpha смешивается с RGB, а затем уже накладываетсяА кто такое сказал -- работает стандартная API функция ОС, как она работать должна правильно, спросить надо Microsoft. Да, кстати, обязательное условие работы с этими компонентами -- это наличие только 32 битных картинок. Смешивать 24 бита и 32 бита не получится |
|||
карма: 22 |
|
Ответов: 8928
Рейтинг: 823
|
|||
nesco писал(а): То, что может делать Фотошоп, никогда не сможет делать HiAsm |
|||
карма: 19 |
|
Ответов: 49
Рейтинг: 11
|
|||
Хорошо, я сделал обе исходные 32 битными, финал тот-же.
стандартная API функция ОС
Похоже Microsoft знает только метод Additive, что и является причиной результата. Прявильней при совмещении графики с альфой использовать Substructive. An additive merge assumes that both foreground and background images are pre-multiplied, meaning that the pixels in the color channels have been multiplied against the pixels in the alpha channel. The result is that transparent pixels are always black, since any number multiplied by a 0 is always going to be 0.
If the images are not pre-multiplied then usually all that is required is a subtractive merge. This method uses the alpha channel from the foreground to cut, or subtract, a hole from the background image. Simply fit the foreground image into that hole. That is known as a subtractive merge.
Подскажите, раз тот способ не работает, как поступить, если надо наложить одно изо 24бит на другое 24бит взяв альфу из третьего изо 8 бит (или 24). В рамках Hiasm я пока вижу способ использования альфы, уже прописанной в картинке. ------------ Дoбавленo в 17.23: Вот, кстати, математика для каждого пиксела: Additive: R1 + R2 * A2 G1 + G2 * A2 B1 + B2 * A2 Substructive: R1 * (255 - A2) + R2 * A2 G1 * (255 - A2) + G2 * A2 B1 * (255 - A2) + B2 * A2 |
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
vovcheck писал(а): В рамках Hiasm я пока вижу способ использования альфы, уже прописанной в картинкеА кто мешает наложить альфа маску на 32-х битную картинку средствами HiAsm-a ------------ Дoбавленo в 17.52: Отконвертировать простую картинку 24 битп в 32 бта можно при помощи AlphaShadow при DeepBlur=0 ------------ Дoбавленo в 18.08: Да, действительно с масками фигня получается, на белый цвет она не накладывапется ------------ Дoбавленo в 18.39: Остается одно -- подумать, как переписать функцию AlphaBlend ------------ Дoбавленo в 22.09: Детальная разборка картинок показала, что созданная в фотошопе вторая картинка не удовлетворяет условию прозрачности элементов HiAsm. Вот пример с нормально созданной для HiAsm-a второй картинкой. И никаких артефактов. Правильно я написал, что нельзя сравнивать две совершенно разные программы, для одной надо одно, для другой -- другое alpha_033.sha |
|||
карма: 22 |
| ||
файлы: 1 | alpha_033.sha [234KB] [510] |
Ответов: 49
Рейтинг: 11
|
|||
Спасибо, nesco, я понял свою ошибку.
------------ Дoбавленo в 22.35: Используя стандартные средства Hiasm возможен только Аддитивный метод. Жаль... |
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
vovcheck писал(а): Используя стандартные средства Hiasm возможен только Аддитивный методЭто -- да, к сожалению, тк функция альфа-канала стандартная. Кстати, а какое преимущество у Substructive метода наложения альфы |
|||
карма: 22 |
|
Ответов: 49
Рейтинг: 11
|
|||
Я работаю в телепроизводстве, там Альфа суть атрибут прозрачности при наложении на графику или видео, причём она (Альфа) никои образом не зависит от цветовой составляющей наложенной графики (или даже наложенного видео). Ну уж так принято.
------------ Дoбавленo в 22.48: Часто (как у меня в данном случае) возникают задачи менять наложенную графику, при этом Альфа либо остаётся та же, либо вызывается из шаблона, из другого источника. Вплоть до оперативного использования библиотеки Альфа-картинок. |
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
vovcheck писал(а): никои образом не зависит от цветовой составляющей наложенной графикиА разве так не везде принято, что альфа от цвета не зависит vovcheck писал(а): либо вызывается из шаблонаА что, не получается средствами HiAsm-a наложить 32-х битную альфу без рисунка (R,G,B,A = 0,0,0,X) на 32-х битный рисунок без альфы (R,G,B,A = X,X,X,0) |
|||
карма: 22 |
|
Ответов: 49
Рейтинг: 11
|
|||
наложить 32-х битную альфу без рисунка (R,G,B,A = 0,0,0,X) на 32-х битный рисунок без альфы (R,G,B,A = X,X,X,0)
Простите, с годами мозг поржавел, спасибо. Сейчас поковыряю. |
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
Я тут уже подумываю о создании конверторов для осуществления таких преобразований. А то приходится делать все эти преобразования с альфой в чужих прогах. Наложить-то альфу можно, но вот делать ее из любого рисунка или его составляющей в HiAsm-e нельзя
|
|||
карма: 22 |
|
Ответов: 49
Рейтинг: 11
|
|||
Пока не выходит.
А возможно ли работать с картинкой как с массивом или матрицей? Ведь тогда возможна попиксельная работа, возможно применение любых пользовательских фильтров. ------------ Дoбавленo в 00.31: StreamConverter - это не оно ли? |
|||
карма: 1 |
|
Разработчик
Ответов: 26163
Рейтинг: 2127
|
|||
vovcheck писал(а): А возможно ли работать с картинкой как с массивом или матрицей? Ведь тогда возможна попиксельная работа, возможно применение любых пользовательских фильтровДа сделать-то такое можно, через Img_GetPoint, но вот скорость работы такого алгоритма, убьет все желание этим пользоваться |
|||
карма: 22 |
|