在 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()?
具有限制和偏移量的 CodeIgniter sql 查询未显示结果
如何在 PySpark 中创建带偏移量的 InputDStream(使用 KafkaUtils.createDirectStream)?