вопрос к fastman'у по графике

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
paradox_
проходил мимо

вопрос к fastman'у по графике

Непрочитанное сообщение paradox_ » 2008-07-06 21:44:14

помниться ты вроде говорил что с графикой работешь постоянно

вот вопросец
а то я чет подзабыл (

есть допустим есть N картинок
к примеру 20x20 точек
вопрос
1 нужно наложить 2 изображение друг на друга
что бы одно было полу прозрачное
тоесть видно и то что на первом изображении и то что на втором как бы за ним
2 сколько изображений можно накладывать подобным образом сохраняя прозрачность
что бы было нормально видно все слои
3 какой алгоритм наложение таких изображений? тоесть что нужно делать с точками? градацию какую то считать или ?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.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/

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: вопрос к fastman'у по графике

Непрочитанное сообщение Fastman » 2008-07-07 0:24:54

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

paradox_
проходил мимо

Re: вопрос к fastman'у по графике

Непрочитанное сообщение paradox_ » 2008-07-07 11:11:44

ну смысл такой что бы сделать прозрачность окон
как висте
или как это делает QIP
или как есть что то в юнихе в десктопе
непомню каком
токо мне не нужен OpenGL итд хардварные причуды
есть одно окно - тоесть область
есть другое окно - еще одна область
и есть еще к примеру N окон
нужен общий алгоритм как нарисовать общее окно
с условием прозрачности для всех окон
там как извесно токо RGB и все
ну и понять какое может быть максимальное количество окон которое можно вывести что бы инфо там различалась
тоесть можно было видеть там к примеру текст
а не расплывчатое непонятно что

хочу свою граф систему для юниха написать
токо пока в размышлениях

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: вопрос к fastman'у по графике

Непрочитанное сообщение Fastman » 2008-07-07 11:54:19

paradox_ писал(а):ну смысл такой что бы сделать прозрачность окон
как висте
или как это делает QIP
или как есть что то в юнихе в десктопе
непомню каком
токо мне не нужен OpenGL итд хардварные причуды
есть одно окно - тоесть область
есть другое окно - еще одна область
и есть еще к примеру N окон
нужен общий алгоритм как нарисовать общее окно
с условием прозрачности для всех окон
там как извесно токо RGB и все
ну и понять какое может быть максимальное количество окон которое можно вывести что бы инфо там различалась
тоесть можно было видеть там к примеру текст
а не расплывчатое непонятно что

хочу свою граф систему для юниха написать
токо пока в размышлениях
Нуууу..это совсем уже другой разговор :)
Во первых.. без хардварных причуд как ты говоришь будет это довольно медленно :)
Второе... ты должен будешь в X.org выставить composite. так выводить изображение будет
всетаки именно энтот самый X.org.
Вообщем тема интересная..я попробую порыть что на нее есть.. потому что написание прикладных
программулин с прозрачностью тривиальней чем свой менджер окон делать....
Главное в жизни здоровье и любовь, остальное я все куплю.

paradox_
проходил мимо

Re: вопрос к fastman'у по графике

Непрочитанное сообщение paradox_ » 2008-07-07 12:01:36

в том то и проблема
что я свою граф систему хочу написать

без всяческих хорг итд
тема в dev null Была насчет десктопа

вообщем нюансы можно пока опустить

впрос токо в том

- есть ли формула по которой можно просто просчитывать RGB 1точки и RGB 2точки что бы получиить третью точку
а в итоге после всех операций над точками получить прозрачное изображение 2х окон

- или нельзя и нет такой простой операции над 2мя точками

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: вопрос к fastman'у по графике

Непрочитанное сообщение Fastman » 2008-07-07 12:32:43

paradox_ писал(а):в том то и проблема
что я свою граф систему хочу написать

без всяческих хорг итд
тема в dev null Была насчет десктопа

вообщем нюансы можно пока опустить

впрос токо в том

- есть ли формула по которой можно просто просчитывать RGB 1точки и RGB 2точки что бы получиить третью точку
а в итоге после всех операций над точками получить прозрачное изображение 2х окон

- или нельзя и нет такой простой операции над 2мя точками
Есть конечно. Если имеется именно попиксельное наложение, то простейший алгоритм я когда то выдирал с RSDN:

Код: Выделить всё

// Шаблон для наложения цвета 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'у по графике

Непрочитанное сообщение hizel » 2008-07-07 13:26:46

http://www.directfb.org/ очень интересный проект ;)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.