Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.043 c
15-1185987836
THandle
2007-08-01 21:03
2007.09.02
Visual Basic


15-1186115317
Alarm
2007-08-03 08:28
2007.09.02
С днем рождения Yakudza


9-1159184845
!Trinix
2006-09-25 15:47
2007.09.02
Snap Cubemap


15-1186505837
hahol
2007-08-07 20:57
2007.09.02
помогите чайнику плз


2-1186723135
Savek
2007-08-10 09:18
2007.09.02
TDBGrid.OnMouseDown





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский