我正在尝试将对象转换为图像。
我使用以下方法从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;
我已经在Python中完成了此任务,并且遇到了类似的问题,但我可以解决,但是我在c#方面的能力不强,因此无法从这里进行开发。我需要将图像旋转90度,但我也认为我的问题与错误地转换数组有关。我认为我需要将对象(SAFEARRAY)转换为多维数组,以使RGB彼此重叠。我看过许多有关如何执行此操作的示例,但我不知道如何执行此操作。
对于我在做什么错的任何反馈,我们将不胜感激。
编辑 我正在查看-> Convert RGB8 byte[] to Bitmap
可能与我的问题有关。
答案 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());
}