如何通过Bitmap :: GetHBITMAP将位图转换为HBITMAP?

时间:2017-11-12 09:59:19

标签: winapi bitmap gdi+ gdi

我需要绘制具有透明度的PNG图像。我使用GDI,GDI +和WinApi。

要加载和绘制图像,我总是使用GDI +,但现在我正在使用更多“本机”GDI算法(StretchBlt等)。

问题是GDI无法加载PNG。我在互联网上搜索了两种方法:

  • 通过GDI +
  • 加载
  • 使用WIC。

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了,是吗?

1 个答案:

答案 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