【发布时间】:2019-07-11 21:16:43
【问题描述】:
According to the documentation 从 byteArray 创建位图的步幅必须为:
步幅是单行像素(扫描线)的宽度,四舍五入到四字节边界。如果步幅为正,则位图是自上而下的。如果步幅为负,则位图为自下而上。
我有一个 byteArray 用于 640 x 512 像素的图像。字节数组是从来自实时摄像机的数组缓冲区创建的。我是第一次创建图像。图像格式为 PixelFormat.Format24bppRgb,因此每个红色、绿色和蓝色一个字节,每个像素总共三个字节。这使得图像的一行 640 * 3 字节 = 1,920 字节。检查它是否能被 4 整除,我得到 1,920/4 = 480。
当我使用 640 * 3 = 1,920 的步幅时,我得到了一个糟糕的结果(图像乱码)。我做错了什么?
我已验证我的 byteArray 具有正确数量的元素并且看起来正确。我的代码如下所示:
int stride = 1920;
using (Bitmap image = new Bitmap(640, 512, stride, PixelFormat.Format24bppRgb, new IntPtr(ptr)))
{
return (Bitmap)image.Clone();
}
编辑 听起来 1920 年的 stride 是正确的,你们都在确认我理解 stride 的工作原理。在这一点上我的猜测是我的像素布局(ARGB VS RGB 或类似的东西)不正确。
【问题讨论】:
-
你不假设位图步幅是什么。从
Bitmap.LockBits获得的BitmapData对象中提取它。例如,BitmapData data = [Bitmap].LockBits(new Rectangle(0, 0, [Bitmap].Width, [Bitmap].Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);(是的,PixelFormat.Format32bppArgb),则位图字节数组为byte[] pixelBuffer = new byte[data.Stride * data.Height];。 -
如果您想确定结果,请将图像复制到新的位图中,使用
PixelFormat.Format32bppArgb。 -
Stride,是扫描线的长度,填充到下一个四个字节的倍数。对于宽度=300,步幅=300,宽度=301,步幅=304..