Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Наложение прозрачного изображения с помощью маски   Найти похожие ветки 

 
Vulix ©   (2006-11-25 14:33) [0]

Привет всем...

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


 
Vovan#2   (2006-11-25 17:07) [1]

>Может есть еще какие идеи?

Ты всё и так замечательно рассказал. Совершенно верно, есть 8-битные маски как один из каналов 32-битного изображения (или вообще отдельная, но не суть). Такая маска и позволит добиться требуемого результата. Только обычно в масках такого типа белый - непрозрачный, чёрный - полностью прозрачный.

Как реализовать? Delphi не умеет выводить 32-битные изображения. Нужно писать самому (вполне реализуемо), либо использовать готовое (переходить с TBitmap на что-то другое, тот же Graphics32, GraphUtil, FastDIB).


 
Vulix ©   (2006-11-25 19:44) [2]

Vovan#2, спасибо за совет. Просто хотелось бы самому разобраться. Каким образом можно создать 8-битную маску для 24-битного изображения? Где-нибудь есть описание алгоритма?
Допустим изображение состоит из 3-ех частей:
1. Прозрачная часть
2. Плавная граница прозрачной и основной частей
3. Основная часть.
Так вот как выделить основную часть и сделать ее 100% непрозрачной, а границу перехода сделать полупрозрачной?


 
Vovan#2   (2006-11-25 21:08) [3]

>Vulix ©   (25.11.06 19:44) [2]

Обычно маска получается при создании изображения. Но если её у тебя, нет, то можно попробовать восстановить.

Формула блендинга для каждого канала:
C = (1-alpha)*A + alpha*B;
alpha = AlphaChannel / 255;
AlphaChannel - от 0 до 255, значение в маске

В том случае, если одноцветное изображение (изначальный цвет известнен) было наложено на одноцветный фон, то можно, сканируя пиксели, для каждого канала составить уравнение, где C, A, B - известны, а ищешь ты альфу, через которую и получишь значение для альфа-канала (т.е. для маски).



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.045 c
3-1178619745
pavel_guzhanov
2007-05-08 14:22
2007.09.02
Ошибка при вставке записи и коммит транзакции


15-1186512073
Loginov Dmitry
2007-08-07 22:41
2007.09.02
Баг в Delphi (от 7 до 2007) с условной компиляцией


15-1186166402
ya00011
2007-08-03 22:40
2007.09.02
HTTP: как сказать качалке о том что докачка не поддерживается?


2-1186834889
Riply
2007-08-11 16:21
2007.09.02
MFT и чтение "неправильных" записей.


2-1186323790
JetAPI
2007-08-05 18:23
2007.09.02
TButton: Как одно событие, согласовать с другим событием?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский