0

ディスク上の画像からサムネイルを取得するには、次の方法があります。

public static BitmapImage GetThumbnail()
{
    var dlg = new OpenFileDialog {Filter = "Imágenes|" + extensionesImagenes};
    var result = dlg.ShowDialog();

    if (result == true)
    {
        var tempFolder = Path.GetTempPath() + "MyTempFolder\\";

        if (!Directory.Exists(tempFolder))
            Directory.CreateDirectory(tempFolder);

        using (var thumbnail = new Bitmap(170, 170))
        {
            using (var gr = Graphics.FromImage(thumbnail))
            {
                gr.SmoothingMode = SmoothingMode.HighQuality;
                gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
                gr.DrawImage(new Bitmap(dlg.FileName), new Rectangle(0, 0, 170, 170));
            }

            thumbnail.Save(tempFolder + "foto.jpg", ImageFormat.Jpeg);
        }

        return new BitmapImage(new Uri(tempFolder + "foto.jpg"));
    }

    return null;
}

初めて実行する場合は問題ありません。しかし、2回目に実行すると、ファイルがアプリで使用されているため、「GDI +で一般的なエラーが発生しました」という例外が発生します。

このメソッドは、ユーザーが行ったアクションに応じて数回呼び出される可能性があり、ファイルを上書きする必要があります。実際のところ、メソッドを初めて呼び出したときにファイルが存在する場合、それは正常に上書きされます。

ファイルは Bitmap クラスの Save() メソッドによって生成され、ストリームは使用していません。

ファイルのロックを解除するにはどうすればよいですか?

ティア

編集

別のメソッドでファイルが必要なため、MemoryStream は使用していません。ユーザーが GetThumbnail メソッドを呼び出すと、サムネイルが StackPanel に表示されます (サムネイルは StackPanel の ImageSource です)。

後で、ユーザーは WPF フォームに表示された情報をデータベースに保存し、画像を含めることができます。データベースに保存するメソッドは、保存された画像からバイトを読み取る必要があります。

編集2

サムネイルを使用する前は、次の方法を使用していました。

public static BitmapImage GetImage()
{
    var dlg = new OpenFileDialog {Filter = "Imágenes|" + extensionesImagenes};
    var result = dlg.ShowDialog();
    return result == true ? new BitmapImage(new Uri(dlg.FileName)) : null;
}

正常に動作していました。

サムネイルを使用しているため、MemoryStream の問題は、画像の Uri を設定できないことです。

たとえば、私は使用していました:

imagenNueva = InterfazUtil.GetImage(); // GetImage() is now GetThumbnail()
var rutaFoto = (imagenNueva != null) ? imagenNueva.ToString() : null;

文字列 rutaFoto は、情報をデータベースに保存するメソッドに渡され、この変数を使用してディスクから画像を読み取ります。

GetThumbnail メソッドで、Image サムネイルを BitmapImage に変換し、SourceUri と BaseUri を次のように設定しようとしました。

新しい Uri(dialog.FileName);

しかし、imagenNueva.ToString() を呼び出すと、有効な Uri が取得されません。

4

1 に答える 1

2
 gr.DrawImage(new Bitmap(dlg.FileName), new Rectangle(0, 0, 170, 170));

そのようなビットマップを使用するのは非常に面倒です。「dlg.FileName」ファイルをロックし、ガベージ コレクターが解放するまでにしばらく時間がかかります。代わりに、次のように記述する必要があります。

 using (var bmp = new Bitmap(dlg.FileName)) {
     gr.DrawImage(bmp, new Rectangle(0, 0, 170, 170));
 }

使用後すぐに破棄され、ファイルのロックも解除されるようになりました。

ところで、代わりに MemoryStream を使用すると、このようなコードの記述を完全に回避できます。画像を MemoryStream に保存するだけなので、ファイルは必要ありません。イメージがそれほど大きくない、または 64 ビット オペレーティング システムで実行できると仮定します。それ以外の場合は、ビットマップの破棄を避ける理由にはなりません。

于 2013-07-22T20:13:11.733 に答える