Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как менять "прозрачность" изображения.


Автор: devmstr 7.4.2005, 12:08
Как менять "прозрачность" изображения.

Автор: chipset 8.4.2005, 09:18
magician, а поподробнее?

Автор: MoZy 10.8.2006, 18:33
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 функции)

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

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

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

Автор: MoZy 20.8.2006, 19:15
devmstr, да пожалуйста. Только  где этот AlphaBlend взять smile ? в АПИ я так понимаю его нет?

Автор: GremlinProg 20.8.2006, 19:34
Как это нет?

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.


Автор: MoZy 20.8.2006, 19:40
GremlinProg, значит справка у меня старая  smile
Может напишешь прототип? и сразу кусок кода как юзать  smile 

Автор: GremlinProg 20.8.2006, 19:52
Прототип лежит в 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

Автор: MoZy 20.8.2006, 20:03
GremlinProg, спасибо! я там еще кое-че нашел  smile  Надо где-то справку новую брать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)