我有一个C#.NET库,用于从相机中抓取帧。我需要将这些帧发送到本地应用程序,该应用程序从unsigned char*
获取图像。
我最初将帧视为System::Drawing::Bitmap
。
到目前为止,我可以从byte[]
检索Bitmap
。我的测试是用分辨率为400 * 234的图像完成的,我应该得到400 * 234 * 3字节来得到RGB图像所需的24bpp。
但是,我的byte[]
大小为11948。
这是我从Bitmap
转换为byte[]
的方式:
private static byte[] ImageToByte(Bitmap img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
从System::Drawing::Bitmap
转换为RGB unsigned char*
的正确方法是什么?
答案 0 :(得分:1)
这必须使用lockBits方法完成,这是一个代码示例:
Rectangle rect = new Rectangle(0, 0, m_bitmap.Width, m_bitmap.Height);
BitmapData bmpData = m_bitmap.LockBits(rect, ImageLockMode.ReadOnly,
m_bitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * m_bitmap.Height;
byte[] rgbValues = new byte[bytes];
Marshal.Copy(ptr, rgbValues, 0, bytes);
m_bitmap.UnlockBits(bmpData);
GCHandle handle = GCHandle::Alloc(rgbValues, GCHandleType::Pinned);
unsigned char * data = (unsigned char*) (void*) handle.AddrOfPinnedObject();
//do whatever with data