c++ - 使蒙版外全部透明
问题描述
我有 jpg 图像和多边形,我想以这种方式用作蒙版:应该显示这个多边形内的图像,并且这个多边形之外的所有图像都应该是 100% 透明的。现在我只实现了第一个目标——我可以在多边形内显示图像,但在它之外都是黑色的:
cv::Mat image;
//load image
image.convertTo(image, CV_8UC3, 255.0);
std::vector<cv::Point> contour;
//load polygon
const cv::Point* elementPoints[1] = { &contour[0] };
int numberOfPoints = (int)contour.size();
cv::Mat mask = cv::Mat::zeros(image.size(), image.type());
cv::fillPoly(mask, elementPoints, &numberOfPoints, 1, cv::Scalar( 255, 255, 255), 8);
cv::Mat dstImage = cv::Mat::zeros(image.size(), image.type());
cv::bitwise_and(image, mask, dstImage);
imwrite("test.jpg", dstImage);
我知道我需要使用 alpha 通道,但目前还不清楚我接下来需要做什么以及如何实现它。
如何在蒙版之外获得透明背景?
解决方案
首先,按照此答案中的描述创建具有四个通道的图像。对第四个通道使用负源使其已经归零。你现在有一个完全透明的图像。
像以前一样创建你的蒙版,只是使用不同的 RGBA 值(注意,Scalar
alpha 值有第四个构造函数参数):
cv::fillPoly(mask, elementPoints, &numberOfPoints, 1, cv::Scalar(0, 0, 0, 255), 8);
最后,应用蒙版将相关区域设置为完全不透明:
cv::bitwise_or(image, mask, dstImage);
您可能希望保留原始图像的 RGB 值(以便稍后进行操作)或清除它们(这将导致更高的压缩率,从而更小的文件大小)。如果是后者,请使用 RGBA 设置为 0, 0, 0, 0 的反转蒙版,并使用bitwise_and
...
推荐阅读
- node.js - 分子 pub/sub 良好实践
- java - 如何在Java中使用正则表达式来匹配单个或多个方括号中的多个或单个值?
- php - Laravel - 如果选择条件
- php - 在 XAMPP 问题中将 PHP 与 MySQL DB 连接
- php - PHP preg_match() 提取文本但匹配的字符串为空
- reactjs - 按下箭头键时如何动态地将鼠标悬停在反应列表元素上?
- django - 页面在与国内链接如“编辑”交互后,如何保持原样而不是刷新并进入顶部?
- python - 在读取相同的 csv 文件时,嵌套的 for 循环在 python 中不起作用
- angular - 如何设置角材料分页器的长度道具
- java - 部署到 docker 后应用程序未创建类