OpenCvSharp_利用imwrite生成透明png图像(附源码)

一、 知识讲解

1、Cv2.ImWrite 是 OpenCV 库中的一个函数,用于将图像保存为文件。它接受两个参数:文件路径和要保存的图像。

Cv2.ImWrite(string filename, Mat img);
  • filename 是保存图像的文件路径,可以是相对路径或绝对路径。文件名的扩展名可以指定为常见的图像格式,例如 ".jpg"、".png" 等。
  • img 是要保存的图像,通常是通过 Cv2.ImRead 或其他方法加载的 Mat 对象。

2、颜色分量的大小可以使用不同的表示方式,以下是常见的几种:

  1. 8位整数表示(0-255):在8位整数表示中,颜色分量的取值范围为0到255。其中,0表示最小强度或者没有颜色,255表示最大强度或者全强度的颜色。这是最常见的表示方式,也是在大多数图像处理库和软件中使用的方式。

  2. 十六进制表示(0x00-0xFF):在十六进制表示中,颜色分量的取值范围为00到FF。每个十六进制数对应一个8位二进制数(00000000到11111111),从而表示了相同的取值范围。这种表示方式常用于编程语言中,例如在代码中表示颜色值。

  3. 浮点数表示(0.0-1.0):在浮点数表示中,颜色分量的取值范围为0.0到1.0。0.0表示最小强度或者没有颜色,1.0表示最大强度或者全强度的颜色。这种表示方式常用于一些图像处理库和软件中,特别是在计算机图形学中。

 二、计算讲解

rgba.Item1 = (byte)(((float)mat.Cols - j) / (float)mat.Cols * 0xff);
  1. (float)mat.Cols - j:将 mat.Cols 的值转换为浮点型,并从中减去 j 的值。这一步计算得到的结果是当前列相对于图像宽度的位置或距离。
  2. ((float)mat.Cols - j) / (float)mat.Cols:将步骤1中得到的结果除以 mat.Cols 的值。这一步计算得到的结果表示当前列相对于整个图像宽度的相对位置或距离。结果范围在 0 到 1 之间。
  3. ((float)mat.Cols - j) / (float)mat.Cols * 0xff:将步骤2中得到的结果乘以 0xff,即十六进制的 255。这一步将相对位置或距离映射到 0 到 255 的范围,以得到颜色分量的值。
  4. (byte)(((float)mat.Cols - j) / (float)mat.Cols * 0xff):将步骤3中得到的浮点型结果转换为字节类型,即将其截断为整数部分并转换为字节。最后得到的值将作为 rgba.Item1 的值。

总结起来,这个计算过程是根据当前列相对于整个图像宽度的位置或距离来计算颜色分量的值。结果值被转换为字节类型,以符合图像数据的存储要求,并保持数据的一致性。

流程:

1、建立窗体项目,在窗体加入一个button按钮

源代码如下

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private 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)
                {
                     //创建一个 Vec4b 对象,用于存储每个像素的颜色和透明度值。
                    var rgba = new Vec4b();
                    // 蓝色,颜色分量的取值范围为00到ff
                    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;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Mat srcImage = createAlphaMat();
            Bitmap map = BitmapConverter.ToBitmap(srcImage);
            pictureBox1.Image = map;

            Cv2.ImWrite("透明Alpha值图.png", srcImage);
        }
    }
}

该文章只针对生成png图片这个按钮

 参考文章:(第2讲 生成png图像 小宅博客网 (bilibili996.com)http://www.bilibili996.com/Course?id=4324175000003http://www.bilibili996.com/Course?id=4324175000003http://www.bilibili996.com/Course?id=4324175000003

猜你喜欢

转载自blog.csdn.net/m0_55074196/article/details/131680015