与网上大多数不同的是,本博贴出的代码,不仅经过测试运行,还检查结果是否正确。以这里代码为例,与网上不同的是:
专门区分了源图的透明度和子图的透明度。因为源图的透明度不为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...); }