处理位图就好像它是一个数组

时间:2012-10-25 22:36:21

标签: c# arrays winforms bitmap

好吧,我想知道是否有人编写代码来在表单上显示位图。
是否有可能像c#中的数组一样直接访问它?

我想知道这是因为位图已经存在于内存和屏幕上 但我不确定如何指出它;喜欢它的指针或数组所以,我想在c#中做这个,我也不知道表格上的数组数据结构(比如RGB BGR / RGB24等)

注意,此图像源不是来自文件,而是来自网络摄像头 另外,我想这样做的原因是因为getpixel / putpixel对我想要的东西来说是慢的。

3 个答案:

答案 0 :(得分:1)

如果你想获得数组中的图像像素,你可以这样做:

            Bitmap image = new Bitmap("somebitmap.png");
            Rectangle area = new Rectangle(0,0,image.Width, image.Height);
            BitmapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int stride = bitmapData.Stride;
            IntPtr ptr = bitmapData.Scan0;
            int numBytes = bitmapData.Stride * image.Height;
            byte[] rgbValues = new byte[numBytes];
            Marshal.Copy(ptr, rgbValues, 0, numBytes);

当你更改它们时,你应该使用以下方法将该数组复制回Bitmap:

            Marshal.Copy(rgbValues, 0, bitmapData.Scan0, bitmapData.Stride * image.Height);
            image.UnlockBits(bitmapData);

但是,如果你真的想像你说的那样处理像素,你应该使用一些FastBitmap实现。还有许多其他实现。

答案 1 :(得分:0)

在C#中访问位图当然是可能的 - 甚至很容易 - 像数组一样。使用Bitmap类:

Bitmap bmp = new Bitmap(640, 480);
Color pixel = bmp.GetPixel(x, y);    // "array like" access
bmp.SetPixel(x,y, Color.FromArgb(red,green,blue);

您的案例中的技巧是将位图放入Bitmap类。如果它已经在表单上,​​您可以创建一个“图形上下文”并从中检索它:

Graphics g = this.CreateGraphics();
Bitmap bmp = new Bitmap(640, 480, g);

或来自对照:

Graphics g = this.MyControl.CreateGraphics();
Bitmap bmp = new Bitmap(640, 480, g);

您无需担心它的内部RGB(A)格式,只需处理'颜色'类型并根据需要设置/获取它的R / G / B组件。

答案 2 :(得分:0)

位图中的像素不是通过数组公开的,即mybitmap [x,y]。

您可以使用GetPixel(x,y)方法访问特定像素的颜色值,或使用SetPixel(x,y)更改值。