Как сохранить изображение с исходной кодировкой

Я сталкиваюсь с неожиданным поведением, когда loading and saving images в .net используя только методы встроенного System.Drawing Пространство имен.

Как я это делаю:
У меня есть изображение, которое я загружаю по телефону System.Drawing.Image.FromStream(),
После некоторых операций мне нужно сохранить изображение с Tagged Image File Format (TIFF) - Я достигаю этого с помощью встроенного в .net вот так:

private void doSomethingAndSave(System.Drawing.Image image, string destFile)
{
  //...doin something...

  //..save the image as Tiff
  image.Save(destFile, ImageFormat.Tiff);
}

Это работает как ожидалось - если я исследую файл, прочитав first 4Bytes я получил:

0x49 0x49 0x2a 0x20

Который успешно идентифицирует TIFF-Image, Все идет нормально...

Проблема, с которой я сталкиваюсь:
Позже в моем коде я должен перезагрузить эти изображения и, возможно, некоторые из другого источника, где я не могу ожидать, что они закодированы как TIFF, но я могу убедиться, что они всегда создаются через .net System.Drawing.Image.Save(),
Поэтому никакие сторонние программы / кодировки не используются.
Возможно, мне придется выполнить некоторые операции и сохранить образ обратно на диск.
На данный момент я хочу сохранить изображение в their same origin format,

Например, я выполняю следующую операцию:

public void RotateImage(string file)
{
   using(var img = System.Drawing.Image.FromFile(file))
   {
     img.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
     img.Save(file);
   }
}

Но теперь, если я исследую файл, я вижу, что формат был преобразован в PNG, первые 8 байт теперь:

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A

Итак Tiff-Изображение "преобразовано" в PNG файл. Я не могу предоставить изображение формата ImageFormat.Tiff параметр по умолчанию, потому что, возможно, исходный файл is not a TIFF закодированный один - я должен сохранить исходный формат!

Я попытался применить исходный ImageFormat вручную: (который также заканчивается в файле PNG)

public void RotateImage(string file)
{
  using(var img = System.Drawing.Image.FromFile(file))
  {
    var imageFormat = img.RawFormat;
    img.RotateFlip(System.Drawing.RotateFlipType.Rotate270FlipNone);
    img.Save(file, imageFormat);
  }
}

Может потому что RawFormat не существует в ImageCodecInfo.GetImageDecoders()... Я пришел к этому, потому что:
Другой подход состоял в том, чтобы оценить кодировку и применить к сохранению:

 public void PerfomOperation(string fileName)
 {
   using (var img = System.Drawing.Image.FromFile(fileName))
   {
     Imaging.EncoderValue format = imaging.EncoderValue.CompressionLZW;
     var codecInfo = this.GetImageCodecInfo(img);
     Imaging.Encoder enc = Imaging.Encoder.Compression;
     Imaging.EncoderParameters ep = new Imaging.EncoderParameters(1);
     ep.Param[0] = new Imaging.EncoderParameter(enc, (long)format);

     img.Save(fileName, codecInfo, ep);
   }
 }

public ImageCodecInfo GetImageCodecInfo(System.Drawing.Image image)
{
  var imgguid = image.RawFormat.Guid;
  foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders())
  {
       if (codec.FormatID == imgguid)
           return codec;
  }
  return null;  // "image/unknown";
}

Но Guid{b96b3caa-0728-11d3-9d7b-0000f81ef32e} в моем Image.RawFormat не существует в ImageCodecInfo - хотя я использовал по умолчанию .net метод Save(image, ImageFormat.Tiff); до!
Поэтому я подумал, что на моей машине должен быть правильный кодек...?

Итак, напоследок:Как сохранить изображение с форматом исходного изображения
(Система предоставляет только форматы.net)

0 ответов

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