2016-01-19 5 views
3

Im используя следующий код, чтобы установить ориентацию изображения принимая во внимание EXIF ​​ориентацию TagУдаление EXIF ​​Не работает при использовании различных кодеров для выбрать формат

static void FixImageOrientation(Image srce) 
     { 
      const int ExifOrientationId = 0x112; 
      // Read orientation tag 
      if (!srce.PropertyIdList.Contains(ExifOrientationId)) return; 
      var prop = srce.GetPropertyItem(ExifOrientationId); 
      var orient = BitConverter.ToInt16(prop.Value, 0); 
      // Force value to 1 
      prop.Value = BitConverter.GetBytes((short)1); 
      srce.SetPropertyItem(prop); 

      // Rotate/flip image according to <orient> 
      switch (orient) 
      { 
       case 1: 
       srce.RotateFlip(RotateFlipType.RotateNoneFlipNone); 
       break; 

       case 2: 
        srce.RotateFlip(RotateFlipType.RotateNoneFlipX); 
        break; 

       case 3: 
        srce.RotateFlip(RotateFlipType.Rotate180FlipNone); 
        break; 

       case 4: 
        srce.RotateFlip(RotateFlipType.Rotate180FlipX); 
        break; 

       case 5: 
        srce.RotateFlip(RotateFlipType.Rotate90FlipX); 
        break; 

       case 6: 
        srce.RotateFlip(RotateFlipType.Rotate90FlipNone); 
        break; 

       case 7: 
        srce.RotateFlip(RotateFlipType.Rotate270FlipX); 
        break; 

       case 8: 
        srce.RotateFlip(RotateFlipType.Rotate270FlipNone); 
        break; 

       default: 
        srce.RotateFlip(RotateFlipType.RotateNoneFlipNone); 
        break; 
      } 
     } 

Этот код удаляет Ориентации Тэг EXIF ​​правильно. И сохранить изображение работает, я просто использовать img.save

Но приложение предоставляет пользователю возможность выбрать формат image.For, что я использую следующий код

private void saveJpeg(string path, Bitmap img, long quality) 
     { 


      EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 


      ImageCodecInfo Codec = this.getEncoderInfo(imgformat); 

      if (Codec == null) 
       return; 

      EncoderParameters encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = qualityParam; 

      img.Save(path + ext, Codec, encoderParams); 
     } 
     public string getimgext(string ccodec) 
     { 
      if (ccodec.Equals("image/png")) 
      { 
       return ".png"; 
      } 
      else if (ccodec.Equals("image/jpeg")) 
      { 
       return ".jpg"; 
      } 
      else if (ccodec.Equals("image/tiff")) 
      { 
       return ".tif"; 
      } 
      else if (ccodec.Equals("image/bmp")) 
      { 
       return ".bmp"; 
      } 

      else if (ccodec.Equals("image/gif")) 
      { 
       return ".gif"; 
      } 
      else 
      { 
       return null; 
      } 

     } 
     private ImageCodecInfo getEncoderInfo(string mimeType) 
     { 
      // Get image codecs for all image formats 
      ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 

      // Find the correct image codec 
      for (int i = 0; i < codecs.Length; i++) 
       if (codecs[i].MimeType == mimeType) 
        return codecs[i]; 
      return null; 
     } 

Когда я откладываю изображение с SaveJpeg изображение сохраняется с неправильной ориентацией. Что я делаю неправильно? Пожалуйста помоги.

UPDATE:

Я изменил метод, так что мне не нужно, чтобы создать новый экземпляр растрового изображения, как процессы цикла многие files.But это не работает, если я не создать новый экземпляр растрового изображения. Этот процесс потребляет дополнительно 10 + секунд времени обработки по сравнению со старой версией. Im, используя код, как этот

image = (Bitmap)FixImageOrientation(Bitmap.FromFile(path)); 


Image FixImageOrientation(Image srce) 
     { 
      const int ExifOrientationId = 0x112; 
      // Read orientation tag 
      if (!srce.PropertyIdList.Contains(ExifOrientationId)) return srce; 
      var prop = srce.GetPropertyItem(ExifOrientationId); 
      var orient = BitConverter.ToInt16(prop.Value, 0); 
      // Force value to 1 
      prop.Value = BitConverter.GetBytes((short)1); 
      srce.SetPropertyItem(prop); 

      // Rotate/flip image according to <orient> 
      switch (orient) 
      { 
       case 1: 
        srce.RotateFlip(RotateFlipType.RotateNoneFlipNone); 
        return srce; 


       case 2: 
        srce.RotateFlip(RotateFlipType.RotateNoneFlipX); 
        return srce; 

       case 3: 
        srce.RotateFlip(RotateFlipType.Rotate180FlipNone); 
        return srce; 

       case 4: 
        srce.RotateFlip(RotateFlipType.Rotate180FlipX); 
        return srce; 

       case 5: 
        srce.RotateFlip(RotateFlipType.Rotate90FlipX); 
        return srce; 

       case 6: 
        srce.RotateFlip(RotateFlipType.Rotate90FlipNone); 
        return srce; 

       case 7: 
        srce.RotateFlip(RotateFlipType.Rotate270FlipX); 
        return srce; 

       case 8: 
        srce.RotateFlip(RotateFlipType.Rotate270FlipNone); 
        return srce; 

       default: 
        srce.RotateFlip(RotateFlipType.RotateNoneFlipNone); 
        return srce; 
      } 
     } 
+0

'saveJpeg' имеет некоторые ошибки компиляции, есть какой-то код не хватает? – Gilgamesh

+0

Я также нашел некоторое время назад, что если пользователь сам ориентирует изображение перед загрузкой, иногда результаты по-прежнему являются неправильной ориентацией. Это было связано с некоторыми программами обработки изображений (Microsoft Office Picture Viewer), которые не удаляют/не обновляют тег EXIF ​​после переориентации. Что-то нужно учитывать. – Balah

ответ

1

В одном методе у вас есть аргумент типа Image, но и в других Bitmap. Так что я угадываю, что вы конвертируете исходное изображение JPEG в растровое изображение перед вызовом FixImageOrientation.

Это будет работать:

var jpeg = Image.FromFile("original.jpg"); 
FixImageOrientation(jpeg); 
var bitmap = new Bitmap(jpeg); 
saveJpeg("new",bitmap,1); 

Это не будет:

var jpeg = Image.FromFile("original.jpg"); 
var bitmap = new Bitmap(jpeg); 
FixImageOrientation(bitmap); 
saveJpeg("new", bitmap, 1); 
+0

Попробуем и вернемся. Спасибо – techno

+0

Спасибо большое :), что действительно было проблемой. Я пробовал модифицировать код FixImageOrientation, чтобы вернуть Bitmap. Это не сработало. Не могли бы вы изменить метод, чтобы я мог предотвратить создание нового объекта, тем самым сохраняя память. – techno

+0

Добро пожаловать @techno. Можете ли вы опубликовать этот измененный код, который не работает? Насколько я знаю, вы не можете преобразовать изображение в растровое изображение без создания экземпляра «Bitmap». Поэтому для сохранения памяти убедитесь, что исходное изображение удалено после создания растрового изображения. –

 Смежные вопросы

  • Нет связанных вопросов^_^