一、前言
中午研究了下在symbian中实现图片透明效果方法。现将方法分享下
二、实现方法
1、首先
制作一张 mask图。
2、再调用BitBltMasked()这个函数画出来
三、实现
1、
制作mask图的函数如下
//参数说明:pBitmap是原位图,iAlpha是透明的指数(0~255)
CFbsBitmap * CMainFrame::CreatMaskImageL(CFbsBitmap *pBitmap, TInt iAlpha)
{
ASSERT(pBitmap != NULL);
CFbsBitmap *ImageMask = new (ELeave) CFbsBitmap();
ImageMask->Create(pBitmap->SizeInPixels(), EGray256);
CFbsDevice *iBitmapDevice = CFbsBitmapDevice::NewL(ImageMask);
CBitmapContext * iBitmapGc;
iBitmapDevice->CreateBitmapContext(iBitmapGc);
iBitmapGc->Clear(TRect(TPoint(0, 0), pBitmap->SizeInPixels()));
iBitmapGc->SetPenStyle(CGraphicsContext::ENullPen);
iBitmapGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
/*
这个参数就是一个透明度了的设置了,参数大小是0~255。这里不好说是0是透明还是255是透明,因为 这个需要
根据你使用的BitBltmask这个函数的最后一个参数定(具体意思看sdk)。如果是设置为ETrue那么0是 完全透明
255是完全不透明,反正如果设置为EFalse,那么255是完全透明。这里可以再程序中动态的改变其透明 度来达到
透明效果动态变化的效果。
*/
iBitmapGc->SetBrushColor(TRgb::Gray256(iAlpha));
iBitmapGc->DrawRect(ImageMask->SizeInPixels());
delete iBitmapDevice;
delete iBitmapGc;
return ImageMask;
}
2、调用画图API画出来
CFbsBitmap *pBitmapMask = CreatMaskImageL(pBitmap, 220);
aGc.BitBltMasked(TPoint(0, 0), pBitmap, pBitmap->SizeInPixels(), pBitmapMask, ETrue);
四、小结
这个方法比较通用,听说在symbian 3rd有更简洁的方法。不过为了可移植性,这种方法好一点!