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

Agregar o eliminar usuarios en Windows desde la consola (y quitar la expiración de contraseña)

Reinicio de asignación de puertos en Windows

Cómo Reducir el Tamaño de una Base de Datos en SQL Server