Допустим, изображение было сделано полупрозрачным и добавлено на плоский фоновый цвет. Исходное изображение, фоновый цвет и результат (смесь) известны. Но эта добавленная прозрачность (альфа-значение) неизвестна и меняется вдоль изображения. Есть ли автоматизированный способ расчета этого добавленного значения прозрачности для каждого пикселя изображения? Можем ли мы скопировать эти значения и применить к другому изображению?
[ Изображение + Прозрачность (неизвестно и варьируется) ] + FlatBackground = Mix (непрозрачный)
= [ Полупрозрачная картинка ] + FlatBackground = Mix(непрозрачный)
Пример копирования каждого добавленного значения прозрачности, соответствующего пикселям изображения:
for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120
Но, конечно, я не хочу печатать эти значения. Я просто хочу использовать их как маску(?). Так что я могу применить эти значения к другой картинке, чтобы создать тот же эффект.
решение1
Прозрачность умножается на исходный пиксель, а не добавляется к нему, чтобы получить смешанный пиксель. Смотрите обсуждение вСпецификация PNG.
Предполагая, что 8-битные цветовые образцы находятся в диапазоне 0..255 и нормализуются до диапазона 0..1.0, сделайте это для каждого пикселя изображения:
m = Mix/255
p = Picture/255
a = alpha = Transparency/255
m = (p * a) + (b * (1.0 - a))
Решите для "а"
a = (m - b) / (p - b)
Преобразовать обратно в исходный диапазон, например, 0..255:
Transparency = a * 255
К сожалению, это означает, что вы не можете извлечь Прозрачность (альфа) из всех пикселей. В частности, когда Изображение == Фон (p - b == 0), то Прозрачность может быть любой в диапазоне 0..255 (a == что угодно от 0.0 до 1.0); если вы используете эту формулу в коде, вам нужно будет защититься от деления на ноль.
Если Picture-Background не равен нулю, то можно получить прозрачность, но это не очень точно, если разница (p - b) мала.