在 WritePixels 中计算步幅和偏移量的问题

Posted

技术标签:

【中文标题】在 WritePixels 中计算步幅和偏移量的问题【英文标题】:Problems calculating stride and offset in WritePixels 【发布时间】:2014-05-22 13:14:24 【问题描述】:

我正在编写一个 Kinect 应用程序,我在其中使用来自传感器的彩色图像。我得到一个 640 x 480 彩色图像,我使用 WritePixels 方法将数据从传感器复制到 WriteableBitmap。当我使用整个彩色图像时,我没有问题。但我只想使用图像的中间部分。但是我不能跨步和或偏移对吗?

要复制整个图像,我执行以下操作:

_colorImageWritableBitmap.WritePixels(
                new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height),
                _colorImageData,
                colorImageFrame.Width * Bgr32BytesPerPixel,
                0);

正如我提到的,我只想要图像的中间部分。我想从 185px 的宽度开始,然后取下一个 270px,然后停在那里。我使用整个高度。

我的PixelFormat是bgr32,所以要计算字节pr。我使用的像素:

var bytesPrPixel = (PixelFormats.Bgr32.BitsPerPixel + 7)/8;

我的步伐:

var stride = bytesPrPixel*width;

writepixel 方法:

_colorImageWritableBitmap.WritePixels(
                new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height),
                _colorImageData, stride, offset);

但是当我将宽度更改为 640 以外的宽度时,图像会出错(隐藏在噪声中)。

有人可以帮助我,了解我在这里做错了什么吗?

【问题讨论】:

你想要中心正方形还是圆形? 只使用中心矩形 270 x 480 跑步时是否编辑宽度?如果是这样,您也需要使用宽度来编辑步幅和所有其他变量。 没有我的宽度是固定的。 【参考方案1】:

您必须从源位图中正确复制像素。假设源colorImageFrame 也是一个BitmapSource,你可以这样做:

var width = 270;
var height = 480;
var x = (colorImageFrame.PixelWidth - width) / 2;
var y = 0;
var stride = (width * colorImageFrame.Format.BitsPerPixel + 7) / 8;
var pixels = new byte[height * stride];
colorImageFrame.CopyPixels(new Int32Rect(x, y, width, height), pixels, stride, 0);

现在您可以通过以下方式将像素缓冲区写入您的 WriteableBitmap:

colorImageWritableBitmap.WritePixels(
    new Int32Rect(0, 0, width, height), pixels, stride, 0);

或者不使用 WriteableBitmap,您只需创建一个新的 BitmapSource,例如:

var targetBitmap = BitmapSource.Create(
    width, height, 96, 96, colorImageFrame.Format, null, pixels, stride);

但是,创建源位图裁剪的最简单方法可能是使用 CroppedBitmap,如下所示:

var targetBitmap = new CroppedBitmap(
    colorImageFrame, new Int32Rect(x, y, width, height));

【讨论】:

谢谢 Clemns,我必须致力于实施,所以之前无法提供建设性的 cmets。我使用 CroppedBitmap 方法解决了我的问题。再次感谢:)

以上是关于在 WritePixels 中计算步幅和偏移量的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?

在python中获取给定日期和UTC偏移量的GMT时间

具有限制和偏移量的 CodeIgniter sql 查询未显示结果

了解位和偏移量的 C 要求 [关闭]

如何在 PySpark 中创建带偏移量的 InputDStream(使用 KafkaUtils.createDirectStream)?

时区分钟偏移量的 TimeZoneInfo