与网上大多数不同的是,本博贴出的代码,不仅经过测试运行,还检查结果是否正确。以这里代码为例,与网上不同的是:
- 专门区分了源图的透明度和子图的透明度。因为源图的透明度不为1,整体画面就会变暗。
- 专门对子图进行了清理动作。否则转成图片之后,会发现图片的顶部总是会有乱纹。
代码如下:
//为什么要区分?因为ALPHA_SOURCE!=1,那么画面变灰,效果不如人意。具体可以自己体验
#define ALPHA_SOURCE 1
#define ALPHA_POLYGON 0.5
void AlphaImage(IplImage* pImage, int x, int y, int width, int height)
{
CvScalar color;
color.val[0] = 0xFF;
color.val[1] = 0;
color.val[2] = 0;
color.val[3] = 0;
IplImage * pTemp=cvCreateImage(cvSize(width,height), pImage->depth, pImage->nChannels);
//把图设置为空。
cvSet(pTemp, CV_RGB(0,0,0), NULL);
//根据需要,是否要填充
cvRectangle(pTemp, cvPoint(0,0), cvPoint(width,height), color, -1);
cvSetImageROI(pImage, cvRect(x, y, width, height));
//注意两个Alpha的不同。
cvAddWeighted(pImage, ALPHA_SOURCE, pTemp, ALPHA_POLYGON, 0.0, pImage);
cvResetImageROI(pImage);
//释放内存
cvReleaseImage(&pTemp);
}
//由一个char*转换为IplImage
//SIZE_RGB=3
int create_image(const char* pRgbData, const int width, const int height)
{
CvSize size;
size.width = width;
size.height= height;
IplImage* iplImage = cvCreateImageHeader(size, IPL_DEPTH_8U, SIZE_RGB);
//注意,这里只能是size.width,不能再加上height
cvSetData(iplImage, pRgbData, size.width*SIZE_RGB);
AlphaImage(iplImage...);
}