首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从bitmap.scan0到float[]的Marshal.copy

从bitmap.scan0到float[]的Marshal.copy
EN

Stack Overflow用户
提问于 2012-11-28 20:35:29
回答 1查看 3K关注 0票数 0

我正在尝试将一个托管位图复制到一个非托管浮点数组中(用于Opencl.net包装器的Cl.CreateImage2D)。不幸的是,我得到了一个异常,但是如果我将数组长度(srcIMGBytesSize)除以4,我就成功了。我的数组的长度有问题吗?图像格式为Format32bppArgb。我使用的是单声道。

代码语言:javascript
复制
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[]数组中时,我得到了以下异常:

代码语言:javascript
复制
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)

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-28 21:04:42

从MSDN查看此link

非托管的C样式数组不包含边界信息,这会阻止验证startIndex和

参数。因此,与source参数对应的非托管数据将填充托管数组,而不管其用途如何。在调用此方法之前,必须使用适当的大小初始化托管数组。

代码语言:javascript
复制
byte[] byteSrcImage2DData = new byte[srcIMGBytesSize];
Marshal.Copy(srcBmpPtr, byteImage2DData, 0, srcIMGBytesSize);

它之所以有效,是因为整个源数组将使用目标数组的所有字段,而不是在第一次尝试时只使用第一个季度。

你可以使用下面的代码来解决你的问题。您可以先将非托管数组复制到字节数组,然后再将字节数组复制到浮点数组:

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13605203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档