Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как менять "прозрачность" изображения. 
V
    Опции темы
devmstr
Дата 7.4.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Как менять "прозрачность" изображения.


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
chipset
Дата 8.4.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 2
Всего: 165



magician, а поподробнее?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
MoZy
Дата 10.8.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: 1
Всего: 0



devmstr, пиши функцию вывода изображения.
Тебе понадобятся:

Контекст1 того, куда выводиться будет твоя картинка
Сама картинка. Помещаешь ее в контекст2
Копируешь кусок контекста1 размером с твою картинку в контекст3
Затем делаешь так:

Код

//Макросы
#define RBIT(pix) BYTE(pix>>16)
#define GBIT(pix) BYTE(pix>>8)
#define BBIT(pix) BYTE(pix)
#define MAKERGB(r,g,b) ( (r<<16)|(g<<8)|b )
#define MAPBIT(pBits,w,x,y)   (*(DWORD*)(pBits + (y * w + x) * 4))

//bitmap - твоя картинка
//MemDC - контекст картинки
//bmp - HBITMAP bmp=CreateCompatibleBitmap(dDC,obj->w, obj->h);
//          SelectObject (FonDC,bmp);
//FonDC - контекст куска фона
//alpha - степень прозрачности (0-100)

BITMAP bi;
GetObject(bitmap, sizeof(BITMAP), &bi);//Получаешь размер картинки

int w=bi.bmWidth, h=bi.bmHeight;

BITMAPINFOHEADER bmi = {0};

BYTE *pBits = new BYTE[ w * h * 4 ];

bmi.biSize = sizeof (bmi);
bmi.biPlanes = 1;
bmi.biBitCount = 32;
bmi.biWidth = w;
bmi.biHeight = h;
//Получаешь биты куска фона                
GetDIBits(FonDC, bmp, 0, h, pBits, (BITMAPINFO*) &bmi, DIB_RGB_COLORS);

BYTE r,g,b,rp,gp,bp;
int x,y;
DWORD pix,pix2;

for(y=0;y<h;y++)
    {
        for(x=0;x<w;x++)
        {
             //Получаем пиксель картинки
             pix=GetPixel(MemDC,x,y);
             rp=GetRValue(pix);
             gp=GetGValue(pix);
             bp=GetBValue(pix);
              
              //Можно сдесь и над маской подумать

              if(alpha)//Если прозрачность установлена
                {
                    //Получаем пиксель фона
                    pix2 = MAPBIT(pBits,w,x,y);
                   //Получаем отдельные компоненты
                    r=RBIT(pix2);
                    g=GBIT(pix2);
                    b=BBIT(pix2);
                    
                    //Смешиваем пиксель фона и картинки
                    r = rp-int((rp-r)*(alpha*0.01));
                    g = gp-int((gp-g)*(alpha*0.01));
                    b = bp-int((bp-b)*(alpha*0.01));

                    if(r<0)r=0;
                    if(g<0)g=0;
                    if(b<0)b=0; 
                    //Суем пиксель обратно в Биты фона
                    SetBit(pBits,obj->w,x,y,MAKERGB(r,g,b));
                }else
                SetBit(pBits,obj->w,x,y,MAKERGB(rp,gp,bp));
         }
}
//Суем уже переработанные биты куска фона (с кортинкой) обратно в контекст
SetDIBitsToDevice(FonDC,0,0, w, h,0,0,0,h,pBits,(BITMAPINFO*) &bmi,DIB_RGB_COLORS);
//Затем выводим его на основной контекст

v1.4  smile  код не проверен (remake функции)


Это сообщение отредактировал(а) MoZy - 10.8.2006, 19:22
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 10.8.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



AlphaBlend работает быстрее, я проверял, тем более, если нужно просто выставить коэффициент прозрачности, SetDIBits... не сравнится


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
devmstr
Дата 11.8.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Фигасебе, теме мою нашли. Я тот проект еще тогда успешно закончил, но извените, как-то тогда не отписался, да и кнопки - Вопрос решен, тогда еще не было. Делал как я помню, через AlphaBlend.

MoZy
Все равно большое спасибо за желаение помочь!


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
MoZy
Дата 20.8.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: 1
Всего: 0



devmstr, да пожалуйста. Только  где этот AlphaBlend взять smile ? в АПИ я так понимаю его нет?
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 20.8.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Как это нет?

Requirements 
  Windows NT/2000/XP: Included in Windows 2000 and later.
  Windows 95/98/Me: Included in Windows 98 and later.
  Header: Declared in Wingdi.h; include Windows.h.
  Library: Included as a resource in Msimg32.dll.




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MoZy
Дата 20.8.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: 1
Всего: 0



GremlinProg, значит справка у меня старая  smile
Может напишешь прототип? и сразу кусок кода как юзать  smile 
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 20.8.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Прототип лежит в wingdi.h, подключается автоматически с подключением windows.h
Код

WINGDIAPI BOOL  WINAPI AlphaBlend(
  HDC hdcDest,                 // handle to destination DC
  int nXOriginDest,            // x-coord of upper-left corner
  int nYOriginDest,            // y-coord of upper-left corner
  int nWidthDest,              // destination width
  int nHeightDest,             // destination height
  HDC hdcSrc,                  // handle to source DC
  int nXOriginSrc,             // x-coord of upper-left corner
  int nYOriginSrc,             // y-coord of upper-left corner
  int nWidthSrc,               // source width
  int nHeightSrc,              // source height
  BLENDFUNCTION blendFunction  // alpha-blending function
);


Единственное, что здесь нужно прокомментировать(остальное как в StretchBlt), так это последний параметр blendFunction. Это структура, содержащая сами параметры бленда:
Код

typedef struct _BLENDFUNCTION {
  BYTE     BlendOp;
  BYTE     BlendFlags;
  BYTE     SourceConstantAlpha;
  BYTE     AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;


BlendOp = AC_SRC_OVER
BlendFlags = 0
SourceConstantAlpha - коэффициент прозрачности, только не [от 0 до 1], а [от 0 до 255]
AlphaFormat = обычно ставится 0, но возможно использовать и с AC_SRC_ALPHA

Это сообщение отредактировал(а) GremlinProg - 20.8.2006, 20:01


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MoZy
Дата 20.8.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 4.6.2006

Репутация: 1
Всего: 0



GremlinProg, спасибо! я там еще кое-че нашел  smile  Надо где-то справку новую брать!
--------------------
Experimentia est optima rerum magistra
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1176 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.