大步向前的另一个问题

时间:2019-07-11 21:16:43

标签: c# bitmap stride

According to the documentation从byteArray创建位图的步幅必须为:

  

跨度是单行像素(扫描线)的宽度,四舍五入到四字节边界。如果跨度为正,则位图是自顶向下的。如果跨度为负,则位图是自下而上的。

我有一个用于640 x 512像素图像的byteArray。字节数组是从实时摄像机传入的arraybuffer中创建的。我是第一次创建图像。图像格式为PixelFormat.Format24bppRgb,因此每个红色,绿色和蓝色一个字节,每个像素总共三个字节。这使得图像的一行640 * 3字节= 1,920字节。检查是否可以被四整除,得到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年的跨步是正确的,你们都在确认我了解跨步的工作原理。我现在的猜测是我的像素布局(ARGB VS RGB或类似的东西)不正确。

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

“乱码”图片的外观: enter image description here

1 个答案:

答案 0 :(得分:-1)

解决了!

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

23.5, 25.2, 29.8 ...

实际传递的值在数千范围内...     7501、7568、7592 ...

垃圾进,垃圾出...

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

谢谢您的帮助。