前几天发了 关于透明bmp贴图的博客,在背景图与贴图背景没有一致像素的情况下,通过位运算实现了透明贴图,对于图片的要求太高,容易出现“事故”
Draw 绘图函数Transparentblt主要的实现代码
————————————————————————————————
实际上,使用png透明贴图效果更好,这要用到CIamge 类(MSDN文档https://msdn.microsoft.com/zh-cn/library/bwea7by5.aspx)
素材图 可以使用PS (添加图层+魔棒抠图) 很简单的制作一个透明色png图
CIamge的头文件
#include <atlimage.h>
主要使用的函数
Load 加载图片
HRESULT Load(
LPCTSTR pszFileName //文件路径
) throw( );
HRESULT Load(
IStream* pStream //文件指针
) throw();
Draw 绘图函数
BOOL Draw(
HDC hDestDC, //目标设备环境DC的句柄
int xDest, //目的矩形的左上角X坐标(逻辑单位)
int yDest, //目的矩形的左上角Y坐标(逻辑单位)
int nDestWidth, //目标矩形的宽度(就是设定贴过去的图片的宽度)
int nDestHeight, //目标矩形的高度(就是设定铁锅的图片的高度)
int xSrc, //源矩形的左上角X坐标
int ySrc, //源矩形的左上角Y坐标
int nSrcWidth, //源矩形的宽度
int nSrcHeight //源矩形的高度
) const throw( );
BOOL Draw(
HDC hDestDC, //目标环境DC的句柄
const RECT& rectDest, //一个RECT结构的引用,用来确定目标图像。
const RECT& rectSrc //一个RECT结构体的引用,用来确定源图像
) const throw( );
BOOL Draw(
HDC hDestDC, //目标环境DC的句柄
int xDest, //目标矩形的左上角X坐标
int yDest //目标矩形的左上角Y坐标
) const throw( ); //
BOOL Draw(
HDC hDestDC, //目标环境DC的句柄
const POINT& pointDest //一个POINT结构体,用来确定目的矩形的左上角坐标
) const throw( );
BOOL Draw(
HDC hDestDC, //目标环境DC的句柄
int xDest, //目标矩形的左上角X坐标
int yDest, //目标矩形的左上角Y坐标
int nDestWidth, //目标矩形的宽度
int nDestHeight //目标矩形的宽度
) const throw( );
BOOL Draw(
HDC hDestDC, //目标环境DC的句柄
const RECT& rectDest //一个RECT结构的引用,用来确定目标图像。
) const throw( );
实际上我测试的是Draw绘制出来的图透明底色 仍然会以白色显示。(应该是还有其他的地方没有处理好,好像是与windows版本有关)
透明的实现函数是下边这个
Transparentblt主要的实现代码BOOL TransparentBlt(
HDC hDestDC,
int xDest,
int yDest,
int nDestWidth,
int nDestHeight,
UINT crTransparent = CLR_INVALID) const throw();
//crTransparent中的源位图被视为透明的颜色。 默认情况下, CLR_INVALID,指示应使用当前设置为图像的透明颜色的颜色。
BOOL TransparentBlt(
HDC hDestDC,
const RECT& rectDest,
UINT crTransparent = CLR_INVALID) const throw();
BOOL TransparentBlt(
HDC hDestDC,
int xDest,
int yDest,
int nDestWidth,
int nDestHeight,
int xSrc,
int ySrc,
int nSrcWidth,
int nSrcHeight,
UINT crTransparent = CLR_INVALID) const throw();
BOOL TransparentBlt(
HDC hDestDC,
const RECT& rectDest,
const RECT& rectSrc,
UINT crTransparent = CLR_INVALID) const throw();
BOOL TransparentBlt(
HDC hDestDC,
int xDest,
int yDest,
int nDestWidth,
int nDestHeight,
UINT crTransparent = CLR_INVALID) const throw();
//crTransparent中的源位图被视为透明的颜色。 默认情况下, CLR_INVALID,指示应使用当前设置为图像的透明颜色的颜色。
BOOL TransparentBlt(
HDC hDestDC,
const RECT& rectDest,
UINT crTransparent = CLR_INVALID) const throw();
BOOL TransparentBlt(
HDC hDestDC,
int xDest,
int yDest,
int nDestWidth,
int nDestHeight,
int xSrc,
int ySrc,
int nSrcWidth,
int nSrcHeight,
UINT crTransparent = CLR_INVALID) const throw();
BOOL TransparentBlt(
HDC hDestDC,
const RECT& rectDest,
const RECT& rectSrc,
UINT crTransparent = CLR_INVALID) const throw();
加载函数
...
hdc bgdc,hdc;
HITBMP bgbmp;
bgbmp = (HBITMAP)LoadImage(NULL, "background.bmp", IMAGE_BITMAP, 961, 600, LR_LOADFROMFILE);
SelectObject(bufdc, this->bgbmp); //加载bmp位图
CImage imagetest;
imagetest.Load("bullet1.png"); //加载贴图
...
————————————————————————————————
绘图函数
void Game::Paint()
{
....
BitBlt(hdc, 0, 0, 941, 600, bufdc, 0, 0, SRCCOPY); //绘制背景
imagetest.TransparentBlt(hdc, 0, 0, imagetest.GetWidth(), imagetest.GetHeight(), RGB(255, 255, 255));//绘制透明贴图
...
}
——————————————————————————————————
背景图是通过Bitblt绘制的bmp图像
贴图是使用TransparentBlt 而非Draw 绘制的(Draw 透明色仍然是白色)
比较方便简单,通过Cimage实现了png透明贴图的绘制:)