Как правильно освободить Image [дубликат]

266
26 февраля 2017, 06:56

На данный вопрос уже ответили:

  • Как отпустить файл, после создания переменной типа Image? 1 ответ

Данный код кропает картинку по нижней части. Сохраненять в файл с тем же названием не дает из-за ошибки использования файла. Поэтому я создал временный файл с расширением tmp. Проблема возникает при удалении - из-за того что ресурс fileName занят. Как его правильно его освободить?

byte[] photoBytes = File.ReadAllBytes(fileName); // для чтения
            FileStream fs = File.OpenWrite(fileName+".tmp"); //  для записи
            using (MemoryStream inStream = new MemoryStream(photoBytes))
            {
                using (MemoryStream outStream = new MemoryStream())
                {
                    using (ImageFactory imageFactory = new ImageFactory(preserveExifData: true))
                    {
                        Image tmp = new Bitmap(Image.FromFile(fileName));
                        imageFactory.Load(inStream)  // грузим картинку
                                    .Crop(new Rectangle(0, 0, tmp.Width, tmp.Height - 62))
                                    .Save(outStream); // сохраняем в поток
                        outStream.WriteTo(fs); // записываем в файл
                        outStream.Close();     // не забываем закрывать потоки ввода-вывода
                    }
                    inStream.Close(); // не забываем закрывать потоки ввода-вывода
                    fs.Close();
                }
            }
            File.Delete(fileName);
            File.Move(fileName+".tmp", fileName);
Answer 1

Зачем так много всего, если это простой Crop. Попробуйте так:

string fileName = "2.png";
byte[] photoBytes = File.ReadAllBytes(fileName); // для чтения
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite)) //  для записи
{
  using (MemoryStream inStream = new MemoryStream(photoBytes))
  {
    ImageFactory imageFactory = new ImageFactory(true);
    var tmp = Image.FromStream(fs);
    var cropImg = imageFactory.Load(inStream).Crop(new Rectangle(0, 0, tmp.Width, tmp.Height - 300));
    inStream.Position = 0;
    cropImg.Save(inStream);
    fs.Position = 0;
    inStream.CopyTo(fs);
  }
}

Я бы ещё проще сделал:

public static void Main(string[] args)
{
  string fileName = "5.png";
  byte[] photoBytes = File.ReadAllBytes(fileName);
  using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite))
  {
    ImageFactory imageFactory = new ImageFactory(true);
    var tmp = Image.FromStream(fs);
    var cropImg = imageFactory.Load(photoBytes).Crop(new Rectangle(0, 0, tmp.Width, tmp.Height - 300));
    fs.Position = 0;
    cropImg.Save(fs);
  }
}
READ ALSO
FormatException при заполнении DataGridView - C#

FormatException при заполнении DataGridView - C#

Прошу помочь с DataGridVievМне нужно, чтобы была таблица в 2 столбца с ранее указанным количеством строк (gg)

471
Заменить спрайт у дочернего объекта в Unity C#

Заменить спрайт у дочернего объекта в Unity C#

Всем приветЕсть задача, сделать кнопку с картинкой и чтобы при наведении на эту кнопку менялась картинка

477
Проблема с групировкой данных

Проблема с групировкой данных

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

344