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

本文关键字:问题 WritePixels 计算 | 更新日期: 2023-09-27 18:04:41

我正在编写一个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,所以我使用:

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

And my stride:

var stride = bytesPrPixel*width;
writepixel方法:
_colorImageWritableBitmap.WritePixels(
                new Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height),
                _colorImageData, stride, offset);

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

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

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

您必须正确地从源位图复制像素。假设源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));