【问题标题】:Yet another issue with stride步幅的另一个问题
【发布时间】: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 或类似的东西)不正确。

这是图像的外观(使用免费的 GenIcam 查看器:

“乱码”图像的外观:

【问题讨论】:

  • 你不假设位图步幅是什么。从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..

标签: c# bitmap stride


【解决方案1】:

解决了!

了解 stride 的工作原理是关键。由于我的步幅正确,我开始寻找其他地方。发生的事情是我传递了一个具有错误值的数组来制作位图。这些值应该具有温度值:

23.5, 25.2, 29.8 ...

实际通过的值在数千范围内...... 7501、7568、7592……

垃圾进,垃圾出……

胡思乱想: 在做这样的事情时,我需要学习如何设置单元测试。当您测试诸如计算圆的周长的方法时,单元测试很容易。我想我需要找到一种方法来设置一个原始数据文件,该文件模拟来自相机的原始数据并通过所有转换运行它以获得图像。

感谢您的所有帮助。

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多