如何在C#中像素级别操作图像

如何在C#中的像素级别操作图像?

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

代码示例将不胜感激。

如果你想要速度,那么LockBits 。 鲍勃·鲍威尔在这里看到一个很好的演练 。 如果你只是想编辑一些,那么GetPixel / SetPixel应该做你想做的。

一个示例代码例程(我使用它来进行简单的合并和比较function,它需要两个图像,并生成第三个灰度图像,显示两个图像之间的差异,作为灰度色调级别,越深色差越大):

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的post提到了LockBits,并使用它来直接在内存中修改图像。 我会build议看看,而不是我所发布的,如果performance是一个问题。 谢谢Marc!

System.Drawing.Bitmap有一个返回System.Drawing.Color结构的GetPixel(int x,int y)public方法。 该结构具有字节成员R,G,B和A,您可以直接修改它们,然后再次在您的位图上调用SetPixel(Color)。
不幸的是,这将是相对缓慢,但它是在C#中最简单的方法。 如果您正在处理单个像素,并且发现性能不足,而且您需要更快速的操作,则可以使用LockBits …但是,这样做要复杂得多,因为您需要了解该颜色深度和types的位结构,并与位图的步幅,不…所以如果你觉得这是必要的,确保你find一个很好的教程! 在网上有几个,谷歌search“C#LockBits”会让你六打值得一读。

如果性能至关重要,LockBits的另一种替代方法是pipe理DirectX。

请参阅前面的Stack Overflow问题在C#中渲染graphics以获取更多信息。

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

与使用普通Bitmap类和PictureBox控件相比,您还可以通过DirectX backbuffering获得更高性能的屏幕渲染效果。