Использование MemoryStream для загрузки.jpg без блокировки файла процессом?

У меня есть своего рода редактор, в котором есть несколько строк и изображение, отображаемое в пользовательском интерфейсе, и я сохраняю данные в текстовом файле и отдельном файле.jpg с тем же именем.

Теперь, когда я пытаюсь переопределить файл.jpg, File.Replace, он говорит, что изображение заблокировано другим процессом, который, очевидно, является процессом моего собственного приложения.

Я надеюсь, что поток памяти может исправить это, потому что он обрабатывается в оперативной памяти. Поэтому я хотел бы загрузить все файлы 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 + "\n\n" + 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();

Но это говорит мне о том, что The Pictrue, я пытаюсь перезаписать, уже используется другим процессом.

Редактировать 3: я пытался использовать решение Пенни Пет и закончил с этим, имея ту же проблему с заблокированным файлом:

  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)));
                        }

См. Метод GetImageFromByteArray в посте PenniePet.

Последнее редактирование:

Это была полностью моя вина, и это действительно смущало меня, я забыл, что я загружал изображение в другой момент. Поскольку я это исправил, проблема с блокировкой больше не существует.

Я выбрал Awnser PenniePete как правильный, потому что я в настоящее время использую его, поскольку это был последний, который я попробовал, и он также открыл мне глаза на мою неудачу.

Я надеюсь, что вы, другие, не будете злиться. Спасибо за всю твою помощь!

3 ответа

Решение

Если я правильно понял, вы хотите прочитать файл.jpg и преобразовать его в объект.Net Bitmap таким образом, чтобы гарантировать, что файл.jpg не будет заблокирован. Если это так, вот некоторые фрагменты кода из моего предыдущего ответа: /questions/23519902/kak-preobrazovat-izobrazhenie-v-bajtovyij-massiv/23519924#23519924

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;
  }

Убедитесь, что вы закрыли поток после сохранения файла.jpg.

При чтении файла убедитесь, что вы установили только Read доступ при открытии потока.

System.IO.FileStream f = new System.IO.FileStream(sPath, FileMode.Open,
                                                         FileAccess.Read);

Используйте f stream для чтения байтов и создания экземпляра MemoryStream используя прочитанные байты:

System.IO.MemoryStream x = new System.IO.MemoryStream(buffer)

Вы должны использовать

bitmap.CacheOption = BitmapCacheOption.OnLoad;

в противном случае ваш файл изображения заблокирован.

Другие вопросы по тегам