在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以外的宽度时,图像会出错(隐藏在噪声中)。
有人可以帮助我,了解我在这里做错了什么?
您必须正确地从源位图复制像素。假设源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));