5

当我尝试保存之前加载的 BitmapSource 时,System.IO.IOException会抛出 a 说明另一个进程正在访问该文件并且无法打开文件流。

如果我只保存而不提前加载,一切正常。

加载代码:

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

现在我不确定这是否可以应用于 BitmapImage 但我在将修改后的图像保存到 GDI+ 中的原始文件时遇到了非常相似的问题

从文件加载图像的方法保持文件上的锁处于打开状态,直到图像对象被释放。

也许它与 bitmapimage.urisource 相同。如果不玩,您可以将图像复制到内存中并处理原件从而解锁文件吗?

于 2009-02-13T17:22:40.540 回答
0

将 CacheOption 设置为 BitmapCacheOption.OnLoad,不会解决您的问题。我认为有一个错误,但我遇到了同样的问题。最后,我将图像加载到内存流并在将图像保存到文件之前处理了 BitmapImage。

于 2009-02-13T20:50:05.847 回答