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

时间:2014-05-22 13:14:24

标签: c# wpf kinect

我正在编写一个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以外时,图像会出错(隐藏在噪点中)。

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

1 个答案:

答案 0 :(得分:0)

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