将颜色和深度数据保存为png到文件流

时间:2015-04-22 22:01:33

标签: c# stream kinect

我尝试使用PngBitmapEncoder将颜色和深度数据保存为PNG分隔文件,但保存的深度帧比颜色少得多。

如果我用JpegBitmapEncoder将颜色保存为Jpeg,使用PngBitmapEncoder将深度保存为PNG,我从两个流中获得相同数量的帧。

任何人都可以解释我为什么吗?

private void myKinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
    {
        using (ColorImageFrame color = e.OpenColorImageFrame())
        {
            if (color != null)
            {
                colorbits = new byte[color.PixelDataLength];
                color.CopyPixelDataTo(colorbits);
                PngBitmapEncoder enc = new PngBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(BitmapSource.Create(color.Width, color.Height, 96, 96, PixelFormats.Bgr32, null, colorbits, color.Width * color.BytesPerPixel)));

                if (StartSavingFrames)
                {
                    string temppath = System.IO.Path.Combine(@"../output/kinect1/color/", colorcnt.ToString() + ".png");
                    FileStream fs = new FileStream(temppath, FileMode.Create);
                    enc.Save(fs);
                    fs.Close();
                    fs = null;
                    colorcnt++;
                }
                else { colorcnt = 0; }
            }
        }
    }



private void myKinectSensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
        {
            using (DepthImageFrame depth = e.OpenDepthImageFrame())
            {

                if (depth != null)
                {
                    frame = new short[depth.PixelDataLength];
                    depth.CopyPixelDataTo(frame);
                    for (int i = 0; i < depth.PixelDataLength; i++)
                    {
                        frame[i] = (short)(((ushort)frame[i]) >> 3);
                    }
                    PngBitmapEncoder enc = new PngBitmapEncoder();
                    enc.Frames.Add(BitmapFrame.Create(BitmapSource.Create(depth.Width, depth.Height, 96, 96, PixelFormats.Gray16, null, frame, depth.Width * depth.BytesPerPixel)));

                    if (StartSavingFrames)
                    {
                        string temppath = System.IO.Path.Combine(@"../output/kinect1/depth/", cnt.ToString() + ".png");
                        FileStream fs = new FileStream(temppath, FileMode.Create);
                        enc.Save(fs);
                        fs.Close();
                        fs = null;
                        cnt++;
                    }
                    else { cnt = 0; }
                }
            }
        }

日Thnx

0 个答案:

没有答案