我有一种编辑器,它在 ui 中显示了一些字符串和图片,并且 IAM 将数据保存在文本文件和具有相同名称的分离.jpg文件中。
现在,当我尝试通过File.Replace
覆盖.jpg文件时,它说图片被另一个进程阻止,这显然是我自己的应用程序的进程。
我希望内存流可以解决此问题,因为它是在 RAM 中处理的。所以我想通过内存流加载所有jpg文件,但我不明白如何使用内存流加载任何东西,如果这是解决我问题的可能方法的话。
编辑:基本上,这是关于的代码截图是这个:
private void CopyPicture(bool PictureHasChanged)
{
try
{ //kopiere die datei nur, wenn sie nicht bereits vorhanden ist.
if (File.Exists(TargetFolder + Exercise.Name + ".jpg") == false)
{//kopiert das neue bild in das zielverzeichnis
File.Copy(Exercise.Bild.UriSource.LocalPath, TargetFolder + Exercise.Name + ".jpg");
}
else
{
//wenn das Bild einer bestehenden übung geändert wurde
if (PictureHasChanged)
{
//überprüft ob eine datei mit dem namen existiert
if (File.Exists(TargetFolder + Exercise.Name + ".jpg") == true)
{//löscht die existente datei
File.Replace(Exercise.Bild.UriSource.LocalPath, TargetFolder + Exercise.Name + ".jpg", TargetFolder + Exercise.Name + ".jpg");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "nn" + ex.Source);
return;
}
}
我将图片存储在内部的简单列表中,作为位图图像: new BitmapImage(new Uri(f.FullName.ToString().Remove(f.FullName.Length - 4, 4) + ".jpg",UriKind.RelativeOrAbsolute))
我希望这有助于更好地了解问题
编辑2:现在我正在执行以下操作以加载图片:
FileStream fsSource = new FileStream(JpgTarget, FileMode.Open, FileAccess.Read);
byte[] bytes = new byte[fsSource.Length];
using (fsSource)
{
// Read the source file into a byte array.
int numBytesToRead = (int)fsSource.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
// Break when the end of the file is reached.
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
//numBytesToRead = bytes.Length;
}
BitmapImage Image = new BitmapImage();
//erstellt das bitmap für die liste
using (MemoryStream Memstream = new MemoryStream(bytes))
{
Image.BeginInit();
Image.StreamSource = Memstream;
Image.CacheOption = BitmapCacheOption.OnLoad;
Image.EndInit();
Image.Freeze();
}
fsSource.Close();
但它一直告诉我,试图覆盖的 Pictrue 已经被另一个进程使用。
编辑3:我尝试使用pennie Pet的解决方案,结果却遇到了这个问题,锁定的文件遇到了同样的问题:
Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(JpgTarget));
using (MemoryStream memory = new MemoryStream())
{
newBitmap.Save(memory, newBitmap.RawFormat);
memory.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
//fügt der liste die aus der textdatei gelesene übung hinzu
List.Add(new Uebung(text, Sitting, wdh, bitmapImage, f.Name.Substring(0, f.Name.Length - 4)));
}
请参阅PenniePet帖子中的GetImageFromByteArray方法e。
上次编辑:
这完全是我的错,这真的让我很尴尬,我忘记了我在另一个点加载图像。自从我修复了它以来,锁定问题不再存在。
我选择了PenniePete的Awnser是正确的,因为我目前正在使用它,因为它是我最后一次尝试,他也让我看到了我的失败。
我希望你们其他人不会生气。感谢您的帮助!
请确保在保存.jpg文件后关闭流。
读取文件时,请确保在打开流时仅设置Read
访问权限。
System.IO.FileStream f = new System.IO.FileStream(sPath, FileMode.Open,
FileAccess.Read);
使用 f 流读取字节并使用读取的字节创建MemoryStream
实例:
System.IO.MemoryStream x = new System.IO.MemoryStream(buffer)
理解正确,您希望读取.jpg文件,并将其转换为.Net Bitmap对象,以确保.jpg文件最终不会被锁定。如果是这样,以下是我之前回答的一些代码片段:https://stackoverflow.com/a/16576471/253938
Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));
和
/// <summary>
/// Method that uses the ImageConverter object in .Net Framework to convert a byte array,
/// presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be
/// used as an Image object.
/// </summary>
/// <param name="byteArray">byte array containing JPEG or PNG file image or similar</param>
/// <returns>Bitmap object if it works, else exception is thrown</returns>
public static Bitmap GetImageFromByteArray(byte[] byteArray)
{
Bitmap bm = (Bitmap)_imageConverter.ConvertFrom(byteArray);
if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution ||
bm.VerticalResolution != (int)bm.VerticalResolution))
{
// Correct a strange glitch that has been observed in the test program when converting
// from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts"
// slightly away from the nominal integer value
bm.SetResolution((int)(bm.HorizontalResolution + 0.5f),
(int)(bm.VerticalResolution + 0.5f));
}
return bm;
}
你必须使用
bitmap.CacheOption = BitmapCacheOption.OnLoad;
否则,您的图像文件将被锁定。