为什么我的程序没有保存图像?

时间:2013-01-01 18:19:09

标签: c# image save kinect kinect-sdk

我有一个程序,其中Kinect获取图像并将其保存到用户指定的位置。我知道程序找到了正确的文件夹,因为它创建了更多文件夹来保存不同类型的图像,并且将创建这些文件夹。我保存图像的当前代码(如下)适用于其他程序,所以有一些参数可以阻止它我不知道吗?提前谢谢。

保存图片

using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
{
    if (colorFrame == null)
    {
        return;
    }

    byte[] pixels = new byte[sensor.ColorStream.FramePixelDataLength];

    //WriteableBitmap image = new WriteableBitmap(
    //     sensor.ColorStream.FrameWidth,
    //     sensor.ColorStream.FrameHeight, 96, 96,
    //     PixelFormats.Bgra32, null);

    colorFrame.CopyPixelDataTo(pixels);

    colorImage.WritePixels(new Int32Rect(0, 0, colorImage.PixelWidth,
                                         colorImage.PixelHeight),
                           pixels, colorImage.PixelWidth * 4, 0);
    //BitmapSource image = BitmapSource.Create(colorFrame.Width, colorFrame.Height,
    //                                         96, 96, PixelFormats.Bgr32, null,
    //                                         pixels, colorFrame.Width * 4);

    //image.WritePixels(new Int32Rect(0, 0, image.PixelWidth, image.PixelHeight),
    //                  pixels, image.PixelWidth * sizeof(int), 0);

    //video.Source = image;

    totalFrames++;
    BitmapEncoder encoder = new JpegBitmapEncoder();

    encoder.Frames.Add(BitmapFrame.Create(colorImage));

    //path = System.IO.Path.Combine("C:/", "Kinected", "Images");

    if (PersonDetected == true)
    {
        if (totalFrames % 10 == 0)
        {
            if (file_name != null && colorImage != null)
            {
                try
                {
                    using (FileStream fs = new FileStream(colorPath +
                           @"\Kinected Image " + time + ".jpg", FileMode.Create))
                    {
                        encoder.Save(fs);
                    }
                }
                catch (IOException)
                {
                    System.Windows.MessageBox.Show("Save Failed");
                }
            }
        }

        skeletonDeLbl.Content = "Skeleton Detected!";
    }

    if (PersonDetected == false) skeletonDeLbl.Content = "No Skeleton Detected.";
}

确定路径

FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.Description =
    "Select which folder you want Kinected to keep all of its information/images in.";
DialogResult result = dialog.ShowDialog();

colorPath = dialog.SelectedPath + @"\Color Images";
depthPath = dialog.SelectedPath + @"\Depth Images";
facePath = dialog.SelectedPath + @"\Face Data";

if (!Directory.Exists(colorPath))
    Directory.CreateDirectory(colorPath);
if (!Directory.Exists(depthPath))
    Directory.CreateDirectory(depthPath);
if (!Directory.Exists(facePath))
    Directory.CreateDirectory(facePath);

System.Windows.MessageBox.Show(colorPath);

修改

结果显示file_name只是空,但现在我收到错误,当它到达using (FileStream fs = new FilesStream(file_name, FileMode.Create))行时,它说:

An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll

Additional information: The given path's format is not supported.

为什么会这样?我使用与Microsoft的演示完全相同的代码,它在那里工作正常。感谢。

1 个答案:

答案 0 :(得分:4)

您应该使用以下代码将字符串组合成路径

colorPath = System.IO.Path.Combine(dialog.SelectedPath, "Color Images");

Combine方法负责在必要时添加或删除反斜杠。


不要忘记使用调试器。您可以设置断点并检查变量并执行更多操作。

调试器是你最好的朋友!


<强>更新

您还在文件名中使用了无效字符。此方法替换无效字符,并对文件名

也应用其他一些修复
/// <summary>
///   Replaces invalid characters in a file name by " ". Apply only to the filename.ext
///   part, not to the path part.
/// </summary>
/// <param name="fileName">A file name (not containing the path part) possibly
///   containing invalid characters.</param>
/// <returns>A valid file name.</returns>
public static string GetValidFileName(string fileName)
{
    string invalidChars = Regex.Escape(new string(Path.GetInvalidFileNameChars()));
    string s = Regex.Replace(fileName, "[" + invalidChars + "]", " ");
    s = Regex.Replace(s, @"\s\s+", " "); // Replace multiple spaces by one space.
    string fil = Path.GetFileNameWithoutExtension(s).Trim().Trim('.');
    string ext = Path.GetExtension(s).Trim().Trim('.');
    if (ext != "") {
        fil += "." + ext;
    }
    fil = fil.Replace(" .", ".");
    return fil == "." ? "" : fil;
}