在 c# 中在像素级别操作图像,以将其解码为文本信息(如果包含)

本文关键字:文本 解码 信息 包含 如果 像素 图像 操作 | 更新日期: 2023-09-27 18:31:12

如果图像包含,我们如何通过计算从图像中获取信息 像素的数量和那里的排列。

在 c# 中在像素级别操作图像,以将其解码为文本信息(如果包含)

您可以在 .Net 中使用 Bitmap 类

这里有一个很好的例子:使用 C# 和 GDI+ 进行图像处理傻瓜书第 1 部分 - 每像素筛选器

此外,以下StackOverflow(问题:如何在C#中在像素级别操作图像)已经提供了答案:D

下面是使用指针操作像素数据的示例。

unsafe
{
int red, blue, green;
editImage = new Bitmap("image.jpg");
editWidth = editImage.Width;
editHeight = editImage.Height;
data = editImage.LockBits(new Rectangle(0, 0, editWidth, editHeight), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte* dataPtr = (byte*)data.Scan0;
h = trackBar1.Value / 60.0;
D = 1 - Math.Abs((h % 2) - 1);
if (h >= 0 && h < 1)
{
    for (int i = 0; i < editHeight; i++)
    {
        offsetStride = i * data.Stride;
        for (int j = 0; j < editWidth; j++)
        {
            blue = dataPtr[(j * 3) + offsetStride];
            green = dataPtr[(j * 3) + offsetStride + 1];
            red = dataPtr[(j * 3) + offsetStride + 2];
            if (green > blue) max = green;
            else max = blue;
            if (red > max) max = red;
            if (green < blue) min = green;
            else min = blue;
            if (red < min) min = red;
            s = (max == 0) ? 0 : 1d - (1d * min / max);
            v = max / 255d;
            C = v * s;
            X = C * D;
            E = v - C;
            dataPtr[(j * 3) + offsetStride] = (byte)(min);
            dataPtr[(j * 3) + offsetStride + 1] = (byte)((X + E) * 255);
            dataPtr[(j * 3) + offsetStride + 2] = (byte)(max);
        }
    }
}
}

这只会改变图像的色调。 对于任何> 100x100 像素的合理大图像,除非性能无关紧要,否则不要使用 GetPixel 或 SetPixel 打扰。

您可以使用 Bitmap (System.Drawing) 类。然后,要操作像素,请使用方法 GetPixel() 和 SetPixel()。但是,如果您想更快地访问像素,请阅读这篇文章:使用 LockBits 方法访问 Bob Powell 利用指针的图像数据,使用不安全的代码进行编译。