使用CImage 加载 PNG文件

//图片类
class CImageEx : public CImage
{
public:
CImageEx(){}
~CImageEx(){}


//加载图片
bool LoadImage(HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType=TEXT("PNG"));


bool SetAlphaBit();


};





bool CImageEx::LoadImage( HINSTANCE hInstance, LPCTSTR pszResourceName,LPCTSTR pszResourceType/*=TEXT("PNG")*/ )
{
//查找资源
HRSRC hResource=FindResource(hInstance,pszResourceName,pszResourceType);
if (hResource==NULL) return false;


//读取资源
DWORD dwImageSize=SizeofResource(hInstance,hResource);
LPVOID pImageBuffer=LoadResource(hInstance,hResource);


//创建数据
IStream * pIStream=NULL;
if (CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK)
{
return false;
}


//写入数据
pIStream->Write(pImageBuffer,dwImageSize,NULL);


HRESULT hr = CImage::Load(pIStream);


//释放资源
pIStream->Release();
pIStream = NULL;


if (hr == S_OK)
{
return SetAlphaBit();   //使PNG图片能透明显示
}
else
{
return false;
}
}


bool CImageEx::SetAlphaBit()   //CImage类是不能画PNG的,透明部分化成白色了,需要用该函数处理
{
if(IsNull())return false; //判断是否加载了bitmap




//函数 GetBPP() 返回每个像素的  bits  个数  位图深度


if ( GetBPP() == 32 )                 //png图像    多了一个透明通道  确认该图像包含Alpha通道
{
LPVOID pBitsSrc = NULL;
BYTE * psrc = NULL;
BITMAP stBmpInfo;               //存储bitmap信息


HBITMAP hBmp = (HBITMAP)*this;   //将  CImage对象     转化为      HBITMAP句柄



::GetObject(hBmp, sizeof(BITMAP), &stBmpInfo);   //根据句柄获取 位图信息存储到stBmpInfo中






if (32 != stBmpInfo.bmBitsPixel || NULL == stBmpInfo.bmBits)  //如果位图 一个像素的位数不是32或者没有数据,则返回false
return false;


psrc = (BYTE *) stBmpInfo.bmBits;                              //位图数据指针赋值给 psrc 


for (int nPosY = 0; nPosY < abs(stBmpInfo.bmHeight); nPosY++)
{
for (int nPosX = stBmpInfo.bmWidth; nPosX > 0; nPosX--)
{
BYTE alpha  = psrc[3];
psrc[0] = (BYTE)((psrc[0] * alpha) / 255);
psrc[1] = (BYTE)((psrc[1] * alpha) / 255);
psrc[2] = (BYTE)((psrc[2] * alpha) / 255);
psrc += 4;
}
}
}


return true;
}



//调用方法

CImageEx m_ImageBack; //图片

HINSTANCE hInstance = AfxGetInstanceHandle();

m_ImageBack.LoadImage(hInstance,TEXT("CELL_BACK"));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值