如何在C#中以像素级别处理图像
c#
image-manipulation
image-processing
6
0

如何在C#中以像素级别处理图像?

我需要能够分别读取/修改每个位图像素RGB值。

代码示例将不胜感激。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

如果要提高速度,请使用LockBits鲍勃·鲍威尔(Bob Powell)的精彩演练,请参见此处 。如果您只想编辑一些内容,那么GetPixel / SetPixel应该可以完成您想要的工作。

收藏
评论

一个示例代码例程(我将其用于简单的合并和比较功能。它获取两个图像,并生成一个第三灰度图像,以灰度级显示两个图像之间的差异。它越黑,差异越大。):

    public static Bitmap Diff(Bitmap src1, Bitmap src2, int x1, int y1, int x2, int y2, int width, int height)
{
    Bitmap diffBM = new Bitmap(width, height, PixelFormat.Format24bppRgb);

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            //Get Both Colours at the pixel point
            Color col1 = src1.GetPixel(x1 + x, y1 + y);
            Color col2 = src2.GetPixel(x2 + x, y2 + y);

            // Get the difference RGB
            int r = 0, g = 0, b = 0;
            r = Math.Abs(col1.R - col2.R);
            g = Math.Abs(col1.G - col2.G);
            b = Math.Abs(col1.B - col2.B);

            // Invert the difference average
            int dif = 255 - ((r+g+b) / 3);

            // Create new grayscale RGB colour
            Color newcol = Color.FromArgb(dif, dif, dif);

            diffBM.SetPixel(x, y, newcol);

        }
    }

    return diffBM;
}

Marc的帖子记录了LockBits,并使用它来直接在内存中修改图像。如果性能令人担忧,我建议您看一下而不是我发布的内容。谢谢马克!

收藏
评论

如果性能至关重要,则可使用LockDirects替代LockBits。

有关更多信息,请参见前面的Stack Overflow问题C#中的“渲染图形”

与Lockbits一样,您将需要使用unsafe关键字/编译器开关,但是您将获得高性能的像素级访问权限。

与使用常规Bitmap类和PictureBox控件相比,通过DirectX反向缓冲还可以获得更高性能的屏幕渲染。

收藏
评论

System.Drawing.Bitmap具有一个GetPixel(int x,int y)公共方法,该方法返回System.Drawing.Color结构。该结构具有字节成员R,G,B和A,您可以直接对其进行修改,然后再次在位图上调用SetPixel(Color)。
不幸的是,这将相对较慢,但这是在C#中最简单的方法。如果您要处理大量的单个像素而发现性能不足,并且需要更快的速度,则可以使用LockBits ...但是要复杂得多,因为您需要了解该颜色深度和类型的位结构,并顺应位图的步幅而工作……所以,如果发现有必要,请确保找到一个不错的教程!网上有好几种,谷歌搜索“ C#LockBits”将为您带来六本值得一读的书。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号