将整个位图数据复制到字节数组

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?

如何将字节数组中的图像文件数据转换为位图?

设备无关位图字节数组到图像:参数无效

Xamarin 安卓。将字节数组转换为位图。 Skia 解码器返回 false

使用 JavaFX 将 BMP 加载到字节数组中