0

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はnullでしたが、次の行に到達するとエラーが発生し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のデモとまったく同じコードを使用していますが、そこでは正常に動作します。ありがとう。

4

1 に答える 1

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;
}
于 2013-01-01T22:21:50.960 に答える