Rotar una imágen basándose en los metadados EXIF (C#)

Mientras estaba escribiendo un generador de miniaturas para un sistema, noté que algunas imágenes generadas no coincidían con el original, y oh sorpresa!, todas las imágenes tenían algo en común: fueron tomadas con celular....

Al abrir las imágenes con Microsoft Paint (Versión XP), pude constatar que las imágenes generadas coincidían con las miniaturas, a pesar que el explorador de archivos y el navegador web decían lo contrario, ¿el culpable? ¡Metadatos!.

Los metadatos son datos adicionales incrustados en un archivo, generalmente al final del mismo; y su función es proporcionar información adicional, que en mi caso es orientación de la imagen.

Existen 8 distintos tipos de Orientación:


1 - Horizontal (normal) - RotateNoneFlipNone

2 - Mirror horizontal - Rotate180FlipY

3 - Rotate 180 - Rotate180FlipNone


4 - Mirror vertical - RotateNoneFlipY

5 - Mirror horizontal and rotate 270 CW - Rotate270FlipY

6 - Rotate 90 CW - Rotate90FlipNone

7 - Mirror horizontal and rotate 90 CW - Rotate90FlipY

8 - Rotate 270 CW - Rotate270FlipNone

Referencias

using System.Drawing;
using System.Drawing.Imaging;

Código

RotateFlipType rotation = RotateFlipType.RotateNoneFlipNone;
            
foreach (PropertyItem item in bitmap.PropertyItems)
{
 if (item.Id == 0x0112)
 {
  int orientation = BitConverter.ToInt16(item.Value, 0);
  switch (orientation)
  {
   case 2: rotation = RotateFlipType.Rotate180FlipY; break;
   case 3: rotation = RotateFlipType.Rotate180FlipNone; break;
   case 4: rotation = RotateFlipType.RotateNoneFlipY; break;
   case 5: rotation = RotateFlipType.Rotate270FlipY; break;
   case 6: rotation = RotateFlipType.Rotate90FlipNone; break;
   case 7: rotation = RotateFlipType.Rotate90FlipY; break;
   case 8: rotation = RotateFlipType.Rotate270FlipNone; break;
  }
  break;
 }
}
image.RotateFlip(rotation); 

Fuentes


Comentarios

Entradas más populares de este blog

Lista de Regex comunes en PHP

Instalar y Cofigurar Xdebug en XAMPP y Visual Studio Code

Archivo XML de configuración de FileZilla