好吧,我想知道是否有人编写代码来在表单上显示位图。
是否有可能像c#中的数组一样直接访问它?
我想知道这是因为位图已经存在于内存和屏幕上 但我不确定如何指出它;喜欢它的指针或数组所以,我想在c#中做这个,我也不知道表格上的数组数据结构(比如RGB BGR / RGB24等)
注意,此图像源不是来自文件,而是来自网络摄像头 另外,我想这样做的原因是因为getpixel / putpixel对我想要的东西来说是慢的。
答案 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)更改值。