我正在尝试将一个托管位图复制到一个非托管浮点数组中(用于Opencl.net包装器的Cl.CreateImage2D)。不幸的是,我得到了一个异常,但是如果我将数组长度(srcIMGBytesSize)除以4,我就成功了。我的数组的长度有问题吗?图像格式为Format32bppArgb。我使用的是单声道。
System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(inputImage);
bitmapData = bmpImage.LockBits( new Rectangle(0, 0, bmpImage.Width, bmpImage.Height), ImageLockMode.ReadOnly, inputImage.PixelFormat);
IntPtr srcBmpPtr = bitmapData.Scan0;
int bitsPerPixel = Image.GetPixelFormatSize( inputImage.PixelFormat );
srcIMGBytesSize = bitmapData.Stride * bitmapData.Height;
float[] srcImage2DData = new float[srcIMGBytesSize];
Marshal.Copy(srcBmpPtr, srcImage2DData, 0, srcIMGBytesSize); //Exception at this line
bmpImage.UnlockBits( bitmapData );当我试图将数据复制到float[]数组中时,我得到了以下异常:
System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object destination, Int32 startIndex, Int32 length)
at System.Runtime.InteropServices.Marshal.Copy(IntPtr source, Single[] destination, Int32 startIndex, Int32 length)谢谢!
发布于 2012-11-28 21:04:42
从MSDN查看此link
非托管的C样式数组不包含边界信息,这会阻止验证startIndex和
参数。因此,与source参数对应的非托管数据将填充托管数组,而不管其用途如何。在调用此方法之前,必须使用适当的大小初始化托管数组。
byte[] byteSrcImage2DData = new byte[srcIMGBytesSize];
Marshal.Copy(srcBmpPtr, byteImage2DData, 0, srcIMGBytesSize);它之所以有效,是因为整个源数组将使用目标数组的所有字段,而不是在第一次尝试时只使用第一个季度。
你可以使用下面的代码来解决你的问题。您可以先将非托管数组复制到字节数组,然后再将字节数组复制到浮点数组:
System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(inputImage);
BitmapData bitmapData = bmpImage.LockBits(new Rectangle(0, 0, bmpImage.Width, bmpImage.Height), ImageLockMode.ReadOnly, inputImage.PixelFormat);
IntPtr srcBmpPtr = bitmapData.Scan0;
int bitsPerPixel = Image.GetPixelFormatSize(inputImage.PixelFormat);
int srcIMGBytesSize = bitmapData.Stride * bitmapData.Height;
byte[] byteSrcImage2DData = new byte[srcIMGBytesSize];
Marshal.Copy(srcBmpPtr, byteSrcImage2DData, 0, srcIMGBytesSize);
float[] srcImage2DData = new float[srcIMGBytesSize];
Array.Copy(byteSrcImage2DData, srcImage2DData,srcIMGBytesSize); //Exception at this line
bmpImage.UnlockBits(bitmapData);https://stackoverflow.com/questions/13605203
复制相似问题