5

以前に読み込んだ BitmapSource を保存しようとすると、System.IO.IOException別のプロセスがそのファイルにアクセスしており、ファイルストリームを開くことができないというメッセージがスローされます。

以前にロードせずに保存するだけであれば、すべて正常に動作します。

読み込みコード:

BitmapImage image = new BitmapImage();

image.BeginInit();
image.UriSource = uri;

if (decodePixelWidth > 0)
image.DecodePixelWidth = decodePixelWidth;

image.EndInit();

保存コード:

using (FileStream fileStream = new FileStream(Directory + "\\" + FileName + ".jpg", FileMode.Create))
{
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create((BitmapImage)image));
    encoder.QualityLevel = 100;
    encoder.Save(fileStream);
}

画像データをロードした後、ファイルはまだロックされており、ファイルを開いたアプリケーションがまだ実行されている間は上書きできません。これを解決する方法はありますか?解決策をありがとう。

4

5 に答える 5

9

この問題についてのコメントに触発されて、すべてのバイトをメモリストリームに読み込み、それをBitmapImageのSreamsourceとして使用することで問題を解決しました。

これは完璧に機能します:

if (File.Exists(filePath))
{
    MemoryStream memoryStream = new MemoryStream();

    byte[] fileBytes = File.ReadAllBytes(filePath);
    memoryStream.Write(fileBytes, 0, fileBytes.Length);
    memoryStream.Position = 0;

    image.BeginInit();
    image.StreamSource = memoryStream;

    if (decodePixelWidth > 0)
        image.DecodePixelWidth = decodePixelWidth;

    image.EndInit();
}
于 2009-02-16T12:01:37.000 に答える
7

元の読み込みコードに基づく別のソリューションを次に示します。

var image = new BitmapImage();
image.BeginInit();

// overwrite cache if already exists, to refresh image
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
// load into memory and unlock file
image.CacheOption = BitmapCacheOption.OnLoad;

image.UriSource = uri;
if (decodePixelWidth > 0) image.DecodePixelWidth = decodePixelWidth;
image.EndInit();
于 2009-05-28T15:14:11.050 に答える
3

読み込みコードに次の行を追加します。

image.CacheOption = BitmapCacheOption.OnLoad;

これにより、ファイルが読み込まれ、メモリに読み込まれ、image.EndInit中にすべて閉じられます。BitmapCacheOption.Defaultのデフォルトには、ファイルを開いてメモリに読み込むという奇妙な動作がありますが、image.EndInit中にまだファイルを閉じていません。

于 2009-02-13T18:20:03.333 に答える
0

CacheOptionをBitmapCacheOption.OnLoadに設定しても、問題は解決しません。バグがあると思いますが、同じ問題がありました。最後に、画像をメモリストリームにロードし、画像をファイルに保存する前にBitmapImageを破棄しました。

于 2009-02-13T20:50:05.847 に答える
0

これが BitmapImage に適用できるかどうかはわかりませんが、変更された画像を GDI+ の元のファイルに保存する際に非常によく似た問題がありましたここ

ファイルから画像をロードするメソッドは、画像オブジェクトが破棄されるまでファイルをロックしたままにします。

もしかしたら、bitmapimage.urisource と同じことかもしれません。いじらずに、画像をメモリにコピーして元の画像を破棄し、ファイルのロックを解除できますか?

于 2009-02-13T17:22:40.540 に答える