我需要绘制具有透明度的PNG图像。我使用GDI,GDI +和WinApi。
要加载和绘制图像,我总是使用GDI +,但现在我正在使用更多“本机”GDI算法(StretchBlt
等)。
问题是GDI无法加载PNG。我在互联网上搜索了两种方法:
WIC似乎太难了(但我期待什么?),所以我选择第一个。
使用GDI +加载PNG图像很容易,只需创建一个Bitmap
对象,将文件路径传递给构造函数,然后调用getHBITMAP()
方法接收HBITMAP
句柄,就是这样。
问题在于HBITMAP
产生的Bitmap
会失去透明度。
我搜索了如何修复它。有不同的方式 - 比如传递Color::Black
作为第一个参数,等等。但它不起作用。
那么,我如何加载PNG图像并将其转换为HBITMAP
并具有透明度?
我不使用DrawImage方法,因为它很慢,GDI更快
我固定了代码:
我理解我的错误:我必须首先将hdc_mem blit到hdcc,然后将图像blit。我做到了,但我有一个新问题__
我上了一堂课来管理上传的图片,这里是代码:
class Imagee
{
HDC hdc; HBITMAP bm;
Imagee(HDC hdc, HBITMAP bm, another args)
{
this->hdc=CreateCompatibleDC(hdc);
this->bm=bm;
SelectObject(this->hdc,this->bm);
}
void draw(int hdcc, int x,int y, int cx, int cy)
{
**StretchBlt(this->hdc,0,0,cx,cy,hdcc,x,y,cx,cy,SRCCOPY); //I'VE ADDED THIS
SelectObject(this->hdc,this->bm); //AND THIS **
StretchBlt(this->hdcc,x,y,cx,cy,hdc,0,0,cx,cy,SRCCOPY);
};
};
Imagee *image;
void render()
{
for(;;)
{
//some draws
//Loading a bitmap via Gdi+, calling a GetHBITMAP function, HBITMAP variable named hbm
if(image==0)
image=new Imagee(hdc_mem, hbm, x, y etc..);
image->draw(hdc_mem, x, y etc..);
StretchBlt(hdc_main,0,0,1920,1080,hdc_mem,0,0,1920,1080,SRCCOPY);
}
我有黑屏。好像我再也不能调用SelectObject了,是吗?
答案 0 :(得分:-1)
解决
class Imagee
{
HDC hdc; HBITMAP bm;
Imagee(HDC hdc, HBITMAP bm, another args)
{
this->hdc=CreateCompatibleDC(hdc);
this->bm=bm;
SelectObject(this->hdc,this->bm);
}
void draw(int hdcc, int x,int y, int cx, int cy)
{
BITMAP btm;
GetObject(bm,sizeof(BITMAP),&btm)
BLENDFUNCTION bf
//initialize bf
AlphaBlend(hdcc,x,y,cx,cy,his->hdcc,0,0,btm.bmWidth,btm.bmHeight,bf);
};
};
Imagee *image;
void render()
{
for(;;)
{
//здесь я загружая через гди+ битмам, конвертирую его в хбитмап, записывая в перменную HBITMAP hbm
if(image==0)
image=new Imagee(hdc_mem, hbm, x, y и т.д.);
image->draw(hdc_mem, x, y и т.д.);
StretchBlt(hdc_main,0,0,1920,1080,hdc_mem,0,0,1920,1080,SRCCOPY); //hdc_main главный дс, hdc_mem буфер
}
}
感谢ru.stackoverflow.com