huangdog 发表于 2015-1-11 15:16:03

C#下怎么从指针指向的byte数组转换成bitmap类型

如题,用的Basler家的GiE相机,使用官方提供的库文件,抓取图像后返回图像数组指针到主窗口下,希望显示在PictureBox控件,请指教~

具体点的话,数组长度和图像分辨率是已知的,8位灰度图像,数组为一维Byte类型的数组,按行存储,一个Byte就是一个像素点;这里实现了再改用12位量化来提高测量的精度。C#下返回一个IntPtr类型的指针

boycn 发表于 2015-1-11 15:50:16

      private Image byteArrayToImage(byte[] Bytes)
      {
            using (MemoryStream ms = new MemoryStream(Bytes))
            {
                Image outputImg = Image.FromStream(ms);
                return outputImg;
            }
      }

wye11083 发表于 2015-1-11 16:11:32

C#下可以直接操作内存。用Marshal.Copy复制内存数据,然后用Bitmap.LockBits获取Bitmap缓冲首地址,然后再将处理后的RGB数据复制给Bitmap。切记C#内存地址是不固定的,不得直接将一个地址传给其它程序。要想传,首先用fixed原语声明内存地址,然后才能传指针。

huangdog 发表于 2015-1-11 16:21:41

wye11083 发表于 2015-1-11 16:11
C#下可以直接操作内存。用Marshal.Copy复制内存数据,然后用Bitmap.LockBits获取Bitmap缓冲首地址,然后再 ...

basler的官方库封装过,不知道给出指针的时候是否已经声明过,不过既然库能直接给出指针,那我认为应该是可以直接使用的;

我来试试你说的方法,2楼的程序我也搜到了,但是怎么改都有错误

wye11083 发表于 2015-1-11 16:28:22

huangdog 发表于 2015-1-11 16:21
basler的官方库封装过,不知道给出指针的时候是否已经声明过,不过既然库能直接给出指针,那我认为应该是可 ...

2L的方法只能读写文件流——你给一块raw它肯定不能工作的。C++的指针在C#里用肯定没问题,但是C#的指针在C++里用,必须用fixed修饰,否则会出错。
你还是先拷出来,处理好,再拷进去吧。这是C#唯一快捷的方法。SetPixel太慢了。
页: [1]
查看完整版本: C#下怎么从指针指向的byte数组转换成bitmap类型