将整个位图数据复制到字节数组
Posted
技术标签:
【中文标题】将整个位图数据复制到字节数组【英文标题】:Copy Entire Bitmap Data to the byte Array 【发布时间】:2020-05-20 11:11:58 【问题描述】:我想将整个位图数据复制到 ByteArray 我知道,我该怎么做? 我使用了下面的 sn-p 代码
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly,bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
但复制到 byteArray 中的值始终为零
这行得通吗?
【问题讨论】:
PixelFormat 是 24bppRgb,是的,在这个 Image 案例中的步幅是积极的,我试图让它首先适用于这个案例,但我猜还是有一个问题 没什么好说的,除非您提供有关所用图像的更多详细信息。你可以附上它。但是,一件非常重要的事情:字节数据是不够的。您还需要返回步幅才能正确处理数据。 旁注:在完成bmpdata
对象后,您应该真正执行UnlockBits
。
【参考方案1】:
总体来说你是有版权的,MSDN上有sample code snippet这样的复制。
您通常应该逐行复制,因为行不必连续布置。
如果您复制的所有数据都为零,则源 bitmap
对象可能首先不包含有效数据,只是黑色。
【讨论】:
是的,没错,我正在整体复制它,但正如您在代码 sn-p 中所建议的那样,我无法将值更改为红色或任何其他值,因为位图数据应该保存下来,那有什么办法吗? 如果您保留来自BitmapData
对象的stride
,则不需要 逐行复制。但是,如果您确实每行复制行,则应该将每行使用的字节数 (int lineWidth = (width * bpp + 7) / 8
) 复制到一个完全紧凑的数组中(大小为 lineWidth * height
)。请注意,您需要在复制过程中使用两个位置指示器; BitmapData 的指针增加了stride
,你自己的数组索引增加了linewidth
。以上是关于将整个位图数据复制到字节数组的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何用相机拍照并将位图转换为字节数组并保存到sqlite db?