вопрос к fastman'у по графике
Модератор: Fastman
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- проходил мимо
вопрос к fastman'у по графике
помниться ты вроде говорил что с графикой работешь постоянно
вот вопросец
а то я чет подзабыл (
есть допустим есть N картинок
к примеру 20x20 точек
вопрос
1 нужно наложить 2 изображение друг на друга
что бы одно было полу прозрачное
тоесть видно и то что на первом изображении и то что на втором как бы за ним
2 сколько изображений можно накладывать подобным образом сохраняя прозрачность
что бы было нормально видно все слои
3 какой алгоритм наложение таких изображений? тоесть что нужно делать с точками? градацию какую то считать или ?
вот вопросец
а то я чет подзабыл (
есть допустим есть N картинок
к примеру 20x20 точек
вопрос
1 нужно наложить 2 изображение друг на друга
что бы одно было полу прозрачное
тоесть видно и то что на первом изображении и то что на втором как бы за ним
2 сколько изображений можно накладывать подобным образом сохраняя прозрачность
что бы было нормально видно все слои
3 какой алгоритм наложение таких изображений? тоесть что нужно делать с точками? градацию какую то считать или ?
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: вопрос к fastman'у по графике
то чего ты хочешь добиться насколько я понял называется alpha blend
в общем случае это вот так выражается:
[r,g,b] = a[r,g,b]{foreground} + (1-a)[r,g,b]{background}
где изображение представленно в виде RGBA а Alpha коэфицент прозрачности.
Алгоритмы я юзал из Image Processing Library (IPL). Это лучший и проверенный способ
Смысл в чем.. у тебя есть фон..и есть изображение которое ты хочешь наложить на него. Тебе нужно вычислить цвет пикселя который получиться после наложения с учетом прозрачности.
Так же можно поглядеть исходники QT, там есть готовые ф-ции работы с изображением..в частности:
QPainter::CompositionMode_SourceOver.
Насколько я помню и пакет ImageMagick тоже умеет это делать, можно поковырять исходники.
По поводу - сколько можно наложить друг на друга - это вопрос цвета и прозрачности изображений.
Если нужно что то более конкретное можно поковырять. для этого нужны и более конкретные условия задачи.
в общем случае это вот так выражается:
[r,g,b] = a[r,g,b]{foreground} + (1-a)[r,g,b]{background}
где изображение представленно в виде RGBA а Alpha коэфицент прозрачности.
Алгоритмы я юзал из Image Processing Library (IPL). Это лучший и проверенный способ

Смысл в чем.. у тебя есть фон..и есть изображение которое ты хочешь наложить на него. Тебе нужно вычислить цвет пикселя который получиться после наложения с учетом прозрачности.
Так же можно поглядеть исходники QT, там есть готовые ф-ции работы с изображением..в частности:
QPainter::CompositionMode_SourceOver.
Насколько я помню и пакет ImageMagick тоже умеет это делать, можно поковырять исходники.
По поводу - сколько можно наложить друг на друга - это вопрос цвета и прозрачности изображений.
Если нужно что то более конкретное можно поковырять. для этого нужны и более конкретные условия задачи.
Главное в жизни здоровье и любовь, остальное я все куплю.
-
- проходил мимо
Re: вопрос к fastman'у по графике
ну смысл такой что бы сделать прозрачность окон
как висте
или как это делает QIP
или как есть что то в юнихе в десктопе
непомню каком
токо мне не нужен OpenGL итд хардварные причуды
есть одно окно - тоесть область
есть другое окно - еще одна область
и есть еще к примеру N окон
нужен общий алгоритм как нарисовать общее окно
с условием прозрачности для всех окон
там как извесно токо RGB и все
ну и понять какое может быть максимальное количество окон которое можно вывести что бы инфо там различалась
тоесть можно было видеть там к примеру текст
а не расплывчатое непонятно что
хочу свою граф систему для юниха написать
токо пока в размышлениях
как висте
или как это делает QIP
или как есть что то в юнихе в десктопе
непомню каком
токо мне не нужен OpenGL итд хардварные причуды
есть одно окно - тоесть область
есть другое окно - еще одна область
и есть еще к примеру N окон
нужен общий алгоритм как нарисовать общее окно
с условием прозрачности для всех окон
там как извесно токо RGB и все
ну и понять какое может быть максимальное количество окон которое можно вывести что бы инфо там различалась
тоесть можно было видеть там к примеру текст
а не расплывчатое непонятно что
хочу свою граф систему для юниха написать
токо пока в размышлениях
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: вопрос к fastman'у по графике
Нуууу..это совсем уже другой разговорparadox_ писал(а):ну смысл такой что бы сделать прозрачность окон
как висте
или как это делает QIP
или как есть что то в юнихе в десктопе
непомню каком
токо мне не нужен OpenGL итд хардварные причуды
есть одно окно - тоесть область
есть другое окно - еще одна область
и есть еще к примеру N окон
нужен общий алгоритм как нарисовать общее окно
с условием прозрачности для всех окон
там как извесно токо RGB и все
ну и понять какое может быть максимальное количество окон которое можно вывести что бы инфо там различалась
тоесть можно было видеть там к примеру текст
а не расплывчатое непонятно что
хочу свою граф систему для юниха написать
токо пока в размышлениях

Во первых.. без хардварных причуд как ты говоришь будет это довольно медленно

Второе... ты должен будешь в X.org выставить composite. так выводить изображение будет
всетаки именно энтот самый X.org.
Вообщем тема интересная..я попробую порыть что на нее есть.. потому что написание прикладных
программулин с прозрачностью тривиальней чем свой менджер окон делать....
Главное в жизни здоровье и любовь, остальное я все куплю.
-
- проходил мимо
Re: вопрос к fastman'у по графике
в том то и проблема
что я свою граф систему хочу написать
без всяческих хорг итд
тема в dev null Была насчет десктопа
вообщем нюансы можно пока опустить
впрос токо в том
- есть ли формула по которой можно просто просчитывать RGB 1точки и RGB 2точки что бы получиить третью точку
а в итоге после всех операций над точками получить прозрачное изображение 2х окон
- или нельзя и нет такой простой операции над 2мя точками
что я свою граф систему хочу написать
без всяческих хорг итд
тема в dev null Была насчет десктопа
вообщем нюансы можно пока опустить
впрос токо в том
- есть ли формула по которой можно просто просчитывать RGB 1точки и RGB 2точки что бы получиить третью точку
а в итоге после всех операций над точками получить прозрачное изображение 2х окон
- или нельзя и нет такой простой операции над 2мя точками
- Fastman
- ст. лейтенант
- Сообщения: 1236
- Зарегистрирован: 2006-07-07 10:20:38
- Откуда: Минск. РБ
Re: вопрос к fastman'у по графике
Есть конечно. Если имеется именно попиксельное наложение, то простейший алгоритм я когда то выдирал с RSDN:paradox_ писал(а):в том то и проблема
что я свою граф систему хочу написать
без всяческих хорг итд
тема в dev null Была насчет десктопа
вообщем нюансы можно пока опустить
впрос токо в том
- есть ли формула по которой можно просто просчитывать RGB 1точки и RGB 2точки что бы получиить третью точку
а в итоге после всех операций над точками получить прозрачное изображение 2х окон
- или нельзя и нет такой простой операции над 2мя точками
Код: Выделить всё
// Шаблон для наложения цвета colorOver на фон (bg).
template< bool t_bUseR // Накладывать красную компоненту
, bool t_bUseG // Накладывать зелёную компоненту
, bool t_bUseB // Накладывать синюю компоненту
, bool t_bUseA // Изменять значение альфаканала
, bool t_bBgIsOpaque // полагать, что bg.A() == 255
, bool t_bUseScale // домножать colorOver.A() на scale
>
inline void blendColors_T( const Color& bg, const Color& colorOver, Color& dst, byte scale = 255 )
{
uint topA = colorOver.A();
if( t_bUseScale )
{
topA *= scale;
topA /= 255;
}
const uint err = 255/2;
switch( topA )
{
case 255:
dst = colorOver; return;
case 0:
dst = bg; return;
default:
uint a3, a4;
if( t_bBgIsOpaque )
{
a3 = uint(255) - topA;
a4 = topA;
}
else
{
uint k = ( uint( uint(255)-topA ) * bg.A() + err ) / 255;
uint a2 = (topA + k);
a3 = (k*uint(255))/a2;
a4 = uint(255)-a3;
if( t_bUseA ) dst.A() = a2;
}
if( t_bUseR ) dst.R() = (bg.R()*a3 + colorOver.R()*a4 + err) / 255;
if( t_bUseG ) dst.G() = (bg.G()*a3 + colorOver.G()*a4 + err) / 255;
if( t_bUseB ) dst.B() = (bg.B()*a3 + colorOver.B()*a4 + err) / 255;
return;
}
}
}
Здесь используется математически правильная формула, сделав небольшое допущение можно ускорить код примерно в два раза -- для этого нужно заменить "/ 255" на ">> 8", ещё можно отказаться от округления в ближайшую сторону отбросив "+ err".
Собственно о параметрах: t_bUseR, t_bUseG, t_bUseB -- какие каналы изображения накладывать, от такой гибкости можно и отказаться, впрочем, на производительность она никак не влияет.
t_bUseA -- после наложения цветов альфаканал меняется, если вдруг не хочется перезаписывать альфаканал, то нужно установить этот параметр в false.
t_bBgIsOpaque -- предпологать что прозрачность фонового цвета равна 255, в этом случае вычисления значительно упрощаются.
t_bUseScale -- домножать прозрачность накладываемого цвета на коэфициент (scale/255), полезно, если хочется на лету делать накладываемый цвет полупрозрачным.
Color& bg -- фоновый цвет;
Color& colorOver -- накладываемый цвет;
Color& dst -- цвет, куда сохраняется результат, может совпадать с bg;
Теперь, допустим у тебя есть два цвета bg = RGBA(100,100,100,100) и colorOver = RGBA(200,200,200,200), после их наложения результирующий цвет тоже будет полупрозрачным (только если альфа bg не равна 255), т.е., в общем случае придётся наложить полученный цвет на цвет, который считается фоновым, например цвет диалога. Но если цвет bg заведомо непрозрачен, то можно обойтись только одним наложением (лучше с флагом t_bBgIsOpaque).
Главное в жизни здоровье и любовь, остальное я все куплю.
- hizel
- дядя поня
- Сообщения: 9032
- Зарегистрирован: 2007-06-29 10:05:02
- Откуда: Выборг
Re: вопрос к fastman'у по графике
http://www.directfb.org/ очень интересный проект 

В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.