利用imwrite生成透明png图像
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
生成效果如下:

下面给大家演示了C#、C++、Python这三种环境下是如何利用imwrite生成透明png图像。
C#版本代码如下:
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
private static Mat createAlphaMat()
{
Mat mat = new Mat(480, 640, MatType.CV_8UC4);
for (int i = 0; i < mat.Rows; ++i)
{
for (int j = 0; j < mat.Cols; ++j)
{
var rgba = new Vec4b();
// 蓝色
rgba.Item0 = 0xff;
// 绿色
rgba.Item1 = (byte)(((float)mat.Cols - j) / (float)mat.Cols * 0xff);
// 红色
rgba.Item2 = (byte)(((float)mat.Rows - i) / (float)mat.Rows * 0xff);
// 透明度
rgba.Item3 = (byte)((float)0.5 * (float)(rgba[1] + rgba[2]));
// 设置
mat.Set(i, j, rgba);
}
}
return mat;
}
static void Main(string[] args)
{
Mat srcImage = createAlphaMat();
Cv2.ImShow("透明Alpha值图.png", srcImage);
//Cv2.ImWrite("透明Alpha值图.png", srcImage);
Cv2.WaitKey();
}
}
}
C++版本代码如下:
#include <vector>
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void createAlphaMat(Mat& mat)
{
for (int i = 0; i < mat.rows; ++i) {
for (int j = 0; j < mat.cols; ++j) {
Vec4b& rgba = mat.at<Vec4b>(i, j);
rgba[0] = UCHAR_MAX;
rgba[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX);
rgba[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX);
rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
}
}
}
int main()
{
//创建带alpha通道的Mat
Mat mat(480, 640, CV_8UC4);
createAlphaMat(mat);
//imshow("透明Alpha值图.png", mat);
//waitKey(0);
vector<int>compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
try {
imwrite("透明Alpha值图.png", mat, compression_params);
}
catch (runtime_error& ex) {
fprintf(stderr, "图像转换成PNG格式发生错误:%s\n", ex.what());
return 1;
}
fprintf(stdout, "PNG图片文件的alpha数据保存完毕~\n");
return 0;
}
Python版本代码如下:
import cv2
import numpy as np
def createAlphaMat(mat):
imgH = mat.shape[0]
imgW = mat.shape[1]
for w in range(imgW):
for h in range(imgH):
b=0xff
g=(imgH-h)/imgH*0xff
r=(imgW-w)/imgW*0xff
a=0.5*(g+r)
mat[h, w] = [b, g, r, a]
return mat
if __name__ == "__main__":
# 创建一个4通道的图片
mat = np.ones((480, 640, 4),np.uint8) * 255
# 设置颜色
mat = createAlphaMat(mat)
# 显示图片
cv2.imshow("透明Alpha值图.png", mat)
# 输出图片
# cv2.imwrite("透明Alpha值图.png", mat)
# 解决输出图片中文乱码问题
cv2.imencode('.png', mat)[1].tofile("透明Alpha值图.png")
# 等待任意输入
cv2.waitKey(0)