我正在编写一个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以外时,图像会出错(隐藏在噪点中)。
有人可以帮助我,了解我在这里做错了吗?
答案 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));