Сохранить изображение поверх существующего изображения

1

Я работаю над приложением С#, в котором первое, что я хочу сделать, это повернуть изображения на основе метаданных в файле. Эта часть работает отлично. Но сохранение изображения поверх существующего изображения - это то, где у меня проблемы. Я удаляю исходный файл, закрываю поток и пытаюсь сохранить изображение в качестве имени исходного изображения, но он не работает. Я получаю следующее исключение:

'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dllAdditional information: A generic error occurred in GDI+.

Это код, который я использую. Это немного отличается от того, что моя рабочая версия так простила меня, если я что-то пропустил. В моей первоначальной версии я просто сохранил

using (FileStream fs = new FileStream(item, FileMode.Open)) {
    im = Image.FromStream(fs);
    sourceFormat = im.RawFormat;

    // Get the image orientation from the image metadata 
    PropertyItem pi = im.GetPropertyItem(274);
    int orientation = pi.Value[0];

    switch (orientation) {
        // TODO: Set rotation and flips for all orientations
        // case 1 - 5 & 7 removed for clarity
        //    break;
        case 6:
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)EncoderValue.TransformRotate90);
            edited = true;
            pi.Value[0] = 1;
            im.SetPropertyItem(pi);
            fs.Close();
            File.Delete(item);
            im.Save(item, GetEncoder(sourceFormat), encoderParameters);
            break;
        case 8:
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)EncoderValue.TransformRotate270);
            pi.Value[0] = 1;
            im.SetPropertyItem(pi);
            fs.Close();
            File.Delete(item);
            im.Save(item, GetEncoder(sourceFormat), encoderParameters);
            break;
        } 
    }

    im.Dispose();
    if (encoderParameters != null)
        encoderParameters.Dispose();
}
Теги:
image
jpeg

2 ответа

1
Лучший ответ

Я изменил ваш код, чтобы протестировать это решение (только доказательство, а не переработка вашей реализации)

encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)System.Drawing.Imaging.EncoderValue.TransformRotate90);
//edited = true;
pi.Value[0] = 1;
im.SetPropertyItem(pi);

// Added new memorystream
System.IO.MemoryStream ms = new MemoryStream();
// Read into memorystream
im.Save(ms, GetEncoder(sourceFormat), encoderParameters);
fs.Close();
File.Delete(item);

// Read from memorystream into byte array
byte[] ni = ms.ToArray();
// Save out using new filestream.
using (FileStream nfs = new FileStream(item, FileMode.Create, FileAccess.ReadWrite)){
    nfs.Write(ni, 0, ni.Length);
}
//im.Save(item, GetEncoder(sourceFormat), encoderParameters);
  • 0
    Да, это делает трюк. Я начал изучать решение, которое было отмечено в комментариях, а затем просто увидел это. Работает как шарм.
1

Попробуйте установить поток для ReadWrite. Кроме того, постарайтесь не Dispoose. Я считаю, что это ваша главная проблема. Кроме того, не закрывайте fs пока не закончите с ним. Я предлагаю вам закрыть fs и изображение после того, как вы закончите использовать его. Может быть, в конце функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню