Допустим, картинка была сделана полупрозрачной и добавлена на ровном цвете фона. Исходная картина, цвет фона и результат (смесь) известны. Но эта дополнительная прозрачность (альфа-значение) неизвестна и изменяется по всей картине. Существует ли автоматический способ расчета этого дополнительного значения прозрачности для каждого пикселя изображения? Можем ли мы скопировать эти значения и применить к другой картинке?

[Изображение + Прозрачность (неизвестно и изменяется)] + 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 ответ1

0

Прозрачность умножается на исходный пиксель, а не добавляется к нему для получения смешанного пикселя. Смотрите обсуждение в спецификации 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

К сожалению, это означает, что вы не можете извлечь прозрачность (альфа) из всех пикселей. В частности, когда Picture == Background (p - b == 0), тогда Transparency может быть любым в диапазоне 0..255 (a == любым от 0.0 до 1.0); если вы используете эту формулу в коде, вам нужно будет защитить ее от деления на ноль.

Когда Picture-Background не равен нулю, вы можете получить прозрачность, но она не очень точна, когда разница (p - b) мала.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .