ディスク上の画像からサムネイルを取得するには、次の方法があります。
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 が取得されません。