Підрахунок кольорів та отримання значень прозорості


0

Скажімо, зображення було зроблено напівпрозорим та додано до плоского кольорового фону. Відомий вихідний малюнок, колір тла та результат (суміш). Але додана прозорість (значення альфа) невідома і змінюється в залежності від малюнка. Чи існує автоматизований спосіб обчислення цього додаткового значення прозорості для кожного пікселя зображення? Чи можемо ми скопіювати ці значення та застосувати до іншого зображення?

[Зображення + Прозорість (невідомо і змінюється)] + FlatBackground = Мікс (непрозорий)

= [Напівпрозорий малюнок] + FlatBackground = Мікс (непрозорий)

Приклад копіювання кожного доданого значення прозорості, що відповідає пікселям зображення:

for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120

Але, звичайно, я не хочу надрукувати ці значення. Я просто хочу використовувати його як маску (?). Так що я можу застосувати ці значення до іншої картини, щоб створити такий же ефект.


Чи допоможе щось на зразок "колір до альфи"? Тобто колір фону трактується як повністю прозорий, а близькі до нього кольори трактуються як напівпрозорі?
Джордж

Відповіді:


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"

a = (m - b) / (p - b)

Перетворити назад у початковий діапазон, наприклад, 0..255:

Transparency = a * 255

На жаль, це означає, що ви не можете витягти прозорість (альфа) з усіх пікселів. Зокрема, коли Picture == Background (p - b == 0), тоді прозорість може бути будь-якою у діапазоні 0..255 (a == що-небудь від 0,0 до 1,0); якщо ви використовуєте цю формулу в коді, вам потрібно буде захистити від ділення на нуль.

Якщо фоновий малюнок не дорівнює нулю, тоді можна отримати прозорість, але це не дуже точно, коли різниця (p - b) невелика.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.