【发布时间】:2014-06-01 13:14:39
【问题描述】:
如果我在具有某种颜色的透明图像(4 个通道)上绘制一条线或某个图形,在我保存图像后,该线/图形是白色的,即使我用红色绘制并且我创建了一个透明图片或我从互联网上打开一个。我错过了一些东西。有什么建议吗?
原图 http://i.imgur.com/Bfy5tNq.png?1
用红色画两条线后的图片 http://i.imgur.com/Pl7BHPT.png?1
Mat image;
image = imread("ball.png", -1);
if(image.channels() == 4)
{
//vector<Mat> ch;
//split(image, ch);
cv::line(image,cv::Point(0,0),cv::Point(image.cols,image.rows),CV_RGB(255,0,0),7,CV_AA,0);
cv::line(image,cv::Point(0,image.rows),cv::Point(image.cols,0),CV_RGB(255,0,0),7,CV_AA,0);
imwrite("out.png", image);
cv::namedWindow("Transparent", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::imshow("Transparent",image);
waitKey(0);
Mat temp(image);
cv::line(temp,cv::Point(0,0),cv::Point(temp.cols,temp.rows),CV_RGB(255,0,0),7,CV_AA,0);
cv::line(temp,cv::Point(0,temp.rows),cv::Point(temp.cols,0),CV_RGB(255,0,0),7,CV_AA,0);
double opacity = 0.9;
cv::addWeighted(temp,opacity,image,1 - opacity,0,image);
cv::namedWindow("opacity",CV_WINDOW_AUTOSIZE);
cv::imshow("opacity",image);
imwrite("opacity.png",image);
waitKey(0);
string path="myimage.png";
Mat myImage(image.rows,image.cols,CV_8UC4);
myImage=cv::Scalar(255,255,255,0);
cv::line(myImage,cv::Point(0,0),cv::Point(image.cols,image.rows),CV_RGB(255,0,0),7,CV_AA,0);
cv::line(myImage,cv::Point(0,image.rows),cv::Point(image.cols,0),CV_RGB(255,0,0),7,CV_AA,0);
imwrite(path,myImage);
我已经尝试了所有这 3 种方法,所有结果都相同。
【问题讨论】:
-
你需要显示一些代码...
-
CV_RGB(255,0,0) 是否创建 RGBA 颜色?而且我不确定openCV在读取/写入图像时是否正确处理透明度。
-
是的!在我保存图片之前,我使用 imshow 功能显示它并且图像有红色线条,但是在我保存它并打开它之后线条是白色的。 opencv 使用第二个参数 -1 (CV_LOAD_IMAGE_UNCHANGED) 调用的 imread 处理透明度 ok。检查此链接docs.opencv.org/modules/highgui/doc/…
-
我认为
imshow不能正确处理 alpha 通道,并且 CV_RGB() 宏会在 RGB 值之后为每个条目创建一个标量,其中包含 0 个条目。我马上给你答复。 -
imshow 不处理 Alpha 通道,没错。这就是为什么当我调用它时,透明图像不透明,它有黑色背景,但这并不困扰我,因为我希望保存的图片是透明的,上面有一个 x,而不是显示的。
标签: opencv png draw transparent