C#将对象转换为图像

时间:2019-07-14 01:33:48

标签: c# arrays multidimensional-array

我正在尝试将对象转换为图像。

我使用以下方法从usb3相机中抓取物体:

object RawData = axActiveUSB1.GetImageWindow(0,0,608,608);

这将返回一个变体(SAFEARRAY)

进一步检查后,RawData = {byte [1824,608]}。图像是608 x 608,因此我猜1824的大小是图像的RGB分量的3倍。 相机的像素格式为BayerRGB8,根据我使用的API,数据类型以字节表示:

相机像素格式|输出格式数据类型尺寸
             拜耳8 | 24位RGB |字节| 0至SizeX * 3-1,0至行-1

我可以使用位于Convert any object to a byte[]

的代码将其转换为字节数组
private byte[] ObjectToByteArray(Object obj)
        {
            if (obj == null)
                return null;
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, obj);
            return ms.ToArray();

        }

然后从这里开始:(所有这些代码也都从堆栈中的信息中找到或派生)

// convert object to bytes
byte[] imgasbytes = ObjectToByteArray(RawData);
// create a bitmap and put data in it to go into the picturebox
var bitmap = new Bitmap(608, 608, PixelFormat.Format24bppRgb);
var bitmap_data = bitmap.LockBits(new Rectangle(0, 0,bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat);

Marshal.Copy(imgasbytes, 0, bitmap_data.Scan0, imgasbytes.Length );
bitmap.UnlockBits(bitmap_data);
var result = bitmap as Image; // this line not even really necessary
PictureBox.Image = result;

该代码有效,但我应该看到以下内容: enter image description here

但是我看到了: enter image description here

我已经在Python中完成了此任务,并且遇到了类似的问题,但我可以解决,但是我在c#方面的能力不强,因此无法从这里进行开发。我需要将图像旋转90度,但我也认为我的问题与错误地转换数组有关。我认为我需要将对象(SAFEARRAY)转换为多维数组,以使RGB彼此重叠。我看过许多有关如何执行此操作的示例,但我不知道如何执行此操作。

对于我在做什么错的任何反馈,我们将不胜感激。

编辑 我正在查看-> Convert RGB8 byte[] to Bitmap

可能与我的问题有关。

1 个答案:

答案 0 :(得分:0)

问题似乎与我所描述的完全一样。 最后,主要问题是需要旋转阵列。 我在这里找到了解决方案-> Rotate M*N Matrix (90 degrees)

当我旋转图像时,它解决了我在上面看到的图像问题。现在我的图像被倒置了,但我理解了问题所在,因此不再看到问题了。

这是万一有人遇到相同问题的代码

#pragma omp parallel for
  for(int i=0; i<N; ++i)
  {
    src.at(i)=rnd.at(i) * dbase.GetXmax();
  #pragma omp atomic 
    std::generate_canonical<double,std::numeric_limits<double>::digits> 
    (generator)
    res.at(i)=dbase.interpolate(rnd.at(i) * dbase.GetXmax());
  }