Limpando metadata dos nosos arquivos de imaxes

Usaremos imagemagick un conxunto de ferramentas pra a manipulación dos arquivos de imaxes moi útiles.

Neste caso se usará “mogrify” que permite modificar os metadatos das imaxes.

Instalación

En fedora:
sudo dnf install imagemagick
En arch:
sudo pacman -S imagemagick
En debian:
sudo apt-get update && apt-get install imagemagick

Qué son os metadatos ?

Os metadatos por definición son datos que se definen a si mesmos, no caso dun arquivo de imaxe son datos acerca da información que conteñen. Como por exemplo a xeoposición de onde se tomou a imaxe, esta pode ser unha información útil, mais se a puxeran enriba da imaxe estropearía a propia imaxe, polo que se engade nestos campos.

Estos campos se poden crear “novos” sen seguir un estándar, como si quixeramos engadir “fase luar na que se tomou a imaxe”, esto o teriamos que programar na aplicación que toma a imaxe, mais é un exemplo.

Como consultar os metadatos dunha imaxe?

Esto pódese consultar cunha ferramenta do paquete imagemagick, chamada “identify”.

Tomamos como exemplo esta imaxe, nome do arquivo “img_0031.jpg”:

Unha foto tomada cun móbil zte open, que serve de exemplo pra ver os metadatos da imaxe.
Vendo os metadatos con identify
$ identify -verbose IMG_0031.jpg 
Image: IMG_0031.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 1536x2048+0+0
  Resolution: 72x72
  Print size: 21.3333x28.4444
  Units: PixelsPerInch
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 97.6666 (0.383006)
      standard deviation: 50.6356 (0.198571)
      kurtosis: 0.864953
      skewness: 0.640492
    Green:
      min: 0 (0)
      max: 216 (0.847059)
      mean: 132.048 (0.517836)
      standard deviation: 50.7752 (0.199118)
      kurtosis: 1.12109
      skewness: -1.32039
    Blue:
      min: 0 (0)
      max: 233 (0.913725)
      mean: 157.405 (0.617275)
      standard deviation: 56.0386 (0.219759)
      kurtosis: 1.43892
      skewness: -1.58746
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 129.04 (0.506039)
      standard deviation: 52.5433 (0.206052)
      kurtosis: 0.691985
      skewness: -0.753495
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 1536x2048+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 85
  Orientation: Undefined
  Properties:
    date:create: 2014-09-07T15:50:52+02:00
    date:modify: 2014-09-07T13:46:40+02:00
    exif:ColorSpace: 1
    exif:ComponentsConfiguration: 1, 2, 3, 0
    exif:Compression: 6
    exif:DateTimeDigitized: 2002:12:08 12:00:00
    exif:DateTimeOriginal: 2014:09:07 15:46:37
    exif:ExifImageLength: 2048
    exif:ExifImageWidth: 1536
    exif:ExifOffset: 130
    exif:ExifVersion: 48, 50, 50, 48
    exif:FlashPixVersion: 48, 49, 48, 48
    exif:FocalLength: 431/100
    exif:InteroperabilityIndex: R98
    exif:InteroperabilityOffset: 316
    exif:InteroperabilityVersion: 48, 49, 48, 48
    exif:ISOSpeedRatings: 0
    exif:JPEGInterchangeFormat: 440
    exif:JPEGInterchangeFormatLength: 24849
    exif:Make: QCOM-AA
    exif:Model: QCAM-AA
    exif:ResolutionUnit: 2
    exif:thumbnail:ResolutionUnit: 2
    exif:thumbnail:XResolution: 72/1
    exif:thumbnail:YResolution: 72/1
    exif:XResolution: 72/1
    exif:YCbCrPositioning: 1
    exif:YResolution: 72/1
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    signature: ef6f2d0c7d691c2f9b72354b1bf117681c87ac3a9f2276e464864d3c25dcb577
  Profiles:
    Profile-exif: 25295 bytes
  Artifacts:
    filename: IMG_0031.jpg
    verbose: true
  Tainted: False
  Filesize: 259KB
  Number pixels: 3.146M
  Pixels per second: 52.43MB
  User time: 0.060u
  Elapsed time: 0:01.060
  Version: ImageMagick 6.8.6-3 2014-04-08 Q16 http://www.imagemagick.org

Vendo a metadata de maneira gráfica con gwenview

Abrimos a imaxe co gwenview e dámoslle a “mais” na columna da esquerda, na xanela que aparece elexímolos campos que queremos ver da imaxe, estos estarán dispoñibles pra marcar se a imaxe dispón deles.

Se amosa unha lista de opcións pra amosar os metadatos dunha imaxe en gwenview.
O peso da imaxen antes é de 256K:
$ du -h IMG_0031.jpg 
256K    IMG_0031.jpg

Limpando os metadatos da imaxe

Copiei a imaxe e a copia lle chamei “IMG_0031_tratado.jpg”.

Aplico o comando pra limpalos metadatos da imaxe:
$ mogrify -strip IMG_0031_tratado.jpg
Este sería o resultado o arquivo sen modificar e a súa copia cos metadatos eliminados:
$ du -ha
256K    ./IMG_0031.jpg
208K    ./IMG_0031_tratado.jpg
464K    .

Observamos unha reducción de 48 KiB só nesa imaxe, mais se houbera sido tomada por outro teléfono móbil ou cámara dixital, seguramente gañaría máis espazo, xa que soen poñer moita información inecesaria pra o usuario, unha vez fixera a proba cunhas imaxes tomadas por un “nokia express music” ( seguramente o modelo sexa do 2005 ou por ahí ), e as imaxes presentaban moita información nos metadatos, como modelo e marca do móbil no que se sacou a imaxe.

Agora vemos a información metadata que amosa da imaxe tratada:
$ identify -verbose IMG_0031_tratado.jpg 
Image: IMG_0031_tratado.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 1536x2048+0+0
  Resolution: 72x72
  Print size: 21.3333x28.4444
  Units: PixelsPerInch
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 97.6667 (0.383007)
      standard deviation: 50.6355 (0.198571)
      kurtosis: 0.8651
      skewness: 0.640484
    Green:
      min: 0 (0)
      max: 216 (0.847059)
      mean: 132.048 (0.517836)
      standard deviation: 50.7751 (0.199118)
      kurtosis: 1.12084
      skewness: -1.32032
    Blue:
      min: 0 (0)
      max: 233 (0.913725)
      mean: 157.406 (0.617277)
      standard deviation: 56.032 (0.219733)
      kurtosis: 1.43918
      skewness: -1.58741
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 129.04 (0.50604)
      standard deviation: 52.5409 (0.206043)
      kurtosis: 0.692225
      skewness: -0.75347
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 1536x2048+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 85
  Orientation: Undefined
  Properties:
    date:create: 2014-09-07T15:58:10+02:00
    date:modify: 2014-09-07T15:58:10+02:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    signature: 64e2d2752edc3656e059b092f0f676205be66af53975699a0755d7eff4ca4307
  Artifacts:
    filename: IMG_0031_tratado.jpg
    verbose: true
  Tainted: False
  Filesize: 213KB
  Number pixels: 3.146M
  Pixels per second: 39.32MB
  User time: 0.070u
  Elapsed time: 0:01.080
  Version: ImageMagick 6.8.6-3 2014-04-08 Q16 http://www.imagemagick.org

Bueno en total gañamos como 48KiB de espazo libre, ¿Pouco? quizáis, mais esta imaxe tratada xa non podrá revelar “moitos datos” sobre nos, que en programas como gwenview se poden ver, mais moitos usuari@s non sabe que esta información queda rexistrada nen saben que existe.

Agora ben… Qué pasaría se aplico o “mogrify -strip” a un directorio cuns 4 “e pico” GiB de imaxes? Cal sería o resultado de eliminar esta información inecesaria da miña colección de fondos de pantaia?

A mesma coa que expliquei o uso de .tar.xz.

Pois coa miña copia de seguridade comprimida en .tar.xz ben a salvo, me dispoño a lanzar o comando sobre o directorio dos fondos de pantaia.

Aquí pódese ver o resumo do espazo ocupado polas imaxes do directorio (omito as dúas mil e pico de liñas do listado ):
$ du -cah
...omito as dúas mil e pico liñas do listado...
1,7M    ./wallpaper 3158.jpg
1,3M    ./wallpaper 3160.jpg
1,4M    ./wallpaper 3161.jpg
2,4M    ./wallpaper 3162.jpg
4,5M    ./wallpaper 3165.jpg
1,1M    ./wallpaper 3174.jpg
640K    ./wallpaper 3177.jpg
1,4M    ./wallpaper 3178.jpg
292K    ./wallpaper 3179.jpg
4,5G    .
4,5G    total

En total son como 4.5 GiB de imaxes .jpg sen comprimir.

Agora executo o comando de limpado de metadatos inecesarios “mogrify -strip” no directorio “WALLPAPERS” cos ficheiros de fondos de pantaia:
$ mogrify -strip ./WALLPAPERS/*
Trala súa execución comprobo canto espacio ocupan agora os ficheiros e este é o grato resultado:
$ du -cah 
...Omito as miles de liñas feitas por cada arquivo...
884K    ./wallpaper 2170.jpg
428K    ./wallpaper 2274.jpg
3,0M    ./wallpaper 2278.jpg
2,8M    ./wallpaper 2279.jpg
1,2M    ./wallpaper 2488.jpg
4,3G    .
4,3G    total

4,3 GiB ! , en total aforrei uns 200 MiB de espazo limpando información inecesaria das imaxes, sen perdela calidade, sen comprimilas, tan só eliminado a súa metadata, tendo en conta que o peso medio dunha imaxe é de 1 MiB, acabo de facer sitio pra unhas 150 ~ 225 imaxes máis.

Esto foi todo, espero que vos gustara esta entrada e que vos axude a gañar máis espazo en disco e a protexela privacidade dos vosos datos.

Saudos