Fájlok metaadatainak olvasása, írása, másolása az ExifTool programmal

botond küldte be 2019. 06. 15., szo – 16:38 időpontban

Az 1. oldal tartalma

 

Bevezető

Az exiftool parancs segítségével különböző fájlformátumok metaadatait  olvashatjuk vagy írhatjuk parancssorból, amely akkor lehet különösen hasznos, amikor nagyobb mennyiségben van szükségünk a fájlok automatizált feldolgozására.

Ebben a leírásban átnézünk néhány általánosabb használati példát, valamint egy komplett automatizáló shell scriptet is kipróbálunk, ami JPG fájlok IPTC adatait másolja át EPS fájlokba.

 

 

Telepítés

Ha nincs még a gépünkön az exiftool csomag, akkor telepítsük az alábbi apt-get paranccsal Debian alapú rendszereken:

sudo apt-get install exiftool

Lényegében ez egy alias név, ami fizikailag a libimage-exiftool-perl csomagot telepíti fel Debian 8 (Jessie)-n a 9.74-es verziót, Debian 9 (Stretch)-re pedig a 10.40-es kiadást.

A parancs futtatása után már használhatjuk is a programot.

 

Alapvető használati módok

Az exiftool parancsot alapvetően háromféle módban használhatjuk a meta adatok kezelésére: olvasás, írás és másolás. Persze rengeteg kapcsolót és opciót támogat a program, de működése szempontjából ezt a három "üzemmódot" érdemes elkülöníteni.

A példákhoz létrehoztam három JPG fájlt, az egyiket a linux-os GIMP programmal (proba_gimp.jpg), a másikat pedig Windows alatt a Photoshop-al (proba_ps.jpg). Mindkettő 1024x768-as üresen lementett kép. A harmadik képfájl pedig egy weboldal PHP scriptje által kezelt/generált fájl (proba_php.jpg), amiben még találhatunk egyéb adatokat is. Talán a JPG fájlok a legáltalánosabb fájlformátumok a metaadatok kezelésének demonstrálására, így ebben a fejezetben ezeken fogunk gyakorolni.

Olvasás

A GIMP-es jpg változat meta adatainak kiolvasása:

exiftool proba_gimp.jpg

A kimenete pedig:

ExifTool Version Number         : 10.40
File Name                       : proba.jpg
Directory                       : .
File Size                       : 10 kB
File Modification Date/Time     : 2019:05:25 10:09:47+02:00
File Access Date/Time           : 2019:05:25 10:10:31+02:00
File Inode Change Date/Time     : 2019:05:25 10:09:47+02:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : inches
X Resolution                    : 72
Y Resolution                    : 72
Comment                         : Created with GIMP
Image Width                     : 1024
Image Height                    : 768
Encoding Process                : Progressive DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:4:4 (1 1)
Image Size                      : 1024x768
Megapixels                      : 0.786

A Photoshop-os képfájl metaadatok kiolvasása pedig:

exiftool proba_ps.jpg

Kimenete:

ExifTool Version Number         : 10.40
File Name                       : proba_ps.jpg
Directory                       : .
File Size                       : 62 kB
File Modification Date/Time     : 2019:05:25 10:24:04+02:00
File Access Date/Time           : 2019:05:25 10:24:21+02:00
File Inode Change Date/Time     : 2019:05:25 10:24:04+02:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
Orientation                     : Horizontal (normal)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Software                        : Adobe Photoshop CS5 Windows
Modify Date                     : 2019:05:25 10:23:42
Color Space                     : sRGB
Exif Image Width                : 1024
Exif Image Height               : 768
Compression                     : JPEG (old-style)
Thumbnail Offset                : 314
Thumbnail Length                : 920
IPTC Digest                     : 00000000000000000000000000000000
Displayed Units X               : inches
Displayed Units Y               : inches
Print Style                     : Centered
Print Position                  : 0 0
Print Scale                     : 1
Global Angle                    : 120
Global Altitude                 : 30
URL List                        : 
Slices Group Name               : Névtelen-1
Num Slices                      : 1
Pixel Aspect Ratio              : 1
Photoshop Thumbnail             : (Binary data 920 bytes, use -b option to extract)
Has Real Merged Data            : Yes
Writer Name                     : Adobe Photoshop
Reader Name                     : Adobe Photoshop CS5
Photoshop Quality               : 12
Photoshop Format                : Standard
Progressive Scans               : 3 Scans
XMP Toolkit                     : Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00
Creator Tool                    : Adobe Photoshop CS5 Windows
Create Date                     : 2019:05:25 10:23:42+02:00
Metadata Date                   : 2019:05:25 10:23:42+02:00
Format                          : image/jpeg
Instance ID                     : xmp.iid:84F62D68C67EE9119084C99B2E87B7B0
Document ID                     : xmp.did:84F62D68C67EE9119084C99B2E87B7B0
Original Document ID            : xmp.did:84F62D68C67EE9119084C99B2E87B7B0
Color Mode                      : RGB
ICC Profile Name                : sRGB IEC61966-2.1
History Action                  : created
History Instance ID             : xmp.iid:84F62D68C67EE9119084C99B2E87B7B0
History When                    : 2019:05:25 10:23:42+02:00
History Software Agent          : Adobe Photoshop CS5 Windows
Profile CMM Type                : Lino
Profile Version                 : 2.1.0
Profile Class                   : Display Device Profile
Color Space Data                : RGB
Profile Connection Space        : XYZ
Profile Date Time               : 1998:02:09 06:49:00
Profile File Signature          : acsp
Primary Platform                : Microsoft Corporation
CMM Flags                       : Not Embedded, Independent
Device Manufacturer             : IEC
Device Model                    : sRGB
Device Attributes               : Reflective, Glossy, Positive, Color
Rendering Intent                : Media-Relative Colorimetric
Connection Space Illuminant     : 0.9642 1 0.82491
Profile Creator                 : HP
Profile ID                      : 0
Profile Copyright               : Copyright (c) 1998 Hewlett-Packard Company
Profile Description             : sRGB IEC61966-2.1
Media White Point               : 0.95045 1 1.08905
Media Black Point               : 0 0 0
Red Matrix Column               : 0.43607 0.22249 0.01392
Green Matrix Column             : 0.38515 0.71687 0.09708
Blue Matrix Column              : 0.14307 0.06061 0.7141
Device Mfg Desc                 : IEC http://www.iec.ch
Device Model Desc               : IEC 61966-2.1 Default RGB colour space - sRGB
Viewing Cond Desc               : Reference Viewing Condition in IEC61966-2.1
Viewing Cond Illuminant         : 19.6445 20.3718 16.8089
Viewing Cond Surround           : 3.92889 4.07439 3.36179
Viewing Cond Illuminant Type    : D50
Luminance                       : 76.03647 80 87.12462
Measurement Observer            : CIE 1931
Measurement Backing             : 0 0 0
Measurement Geometry            : Unknown
Measurement Flare               : 0.999%
Measurement Illuminant          : D65
Technology                      : Cathode Ray Tube Display
Red Tone Reproduction Curve     : (Binary data 2060 bytes, use -b option to extract)
Green Tone Reproduction Curve   : (Binary data 2060 bytes, use -b option to extract)
Blue Tone Reproduction Curve    : (Binary data 2060 bytes, use -b option to extract)
DCT Encode Version              : 100
APP14 Flags 0                   : [14]
APP14 Flags 1                   : (none)
Color Transform                 : YCbCr
Image Width                     : 1024
Image Height                    : 768
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:4:4 (1 1)
Image Size                      : 1024x768
Megapixels                      : 0.786
Thumbnail Image                 : (Binary data 920 bytes, use -b option to extract)

Amint láthatjuk, a Photoshop sokkal több dolgot tárol a lementett képfájlok meta részében.

 

 

És a PHP által lementett kép metaadatai:

exiftool proba_php.jpg
ExifTool Version Number         : 10.40
File Name                       : proba_php.jpg
Directory                       : .
File Size                       : 264 kB
File Modification Date/Time     : 2019:05:25 11:57:55+02:00
File Access Date/Time           : 2019:05:25 12:14:09+02:00
File Inode Change Date/Time     : 2019:05:25 12:05:45+02:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Comment                         : CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 85.
Image Width                     : 2828
Image Height                    : 2828
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 2828x2828
Megapixels                      : 8.0

Itt pedig ami érdekesség van az a "Comment" mezőben lévő adat, ami mutatja hogy a kép a PHP GD képkezelő kiterjesztésével lett létrehozva 85-ös képminőségi beállítással.

Csoportok

A meta adatok strukturált formában kerülnek beágyazásra a fájlokban, ezért lehetőség van az összefüggő adatok külön csoportját is lekérdezni, mint például az XMP rekordot is, amit az Adobe alkalmazásai helyeznek el a képfájlokban. Ezt a következőképpen kérhetjük le a Photoshop által lementett képfájlból:

exiftool -XMP:all proba_ps.jpg
XMP Toolkit                     : Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00
Creator Tool                    : Adobe Photoshop CS5 Windows
Create Date                     : 2019:05:25 10:23:42+02:00
Metadata Date                   : 2019:05:25 10:23:42+02:00
Format                          : image/jpeg
Instance ID                     : xmp.iid:84F62D68C67EE9119084C99B2E87B7B0
Document ID                     : xmp.did:84F62D68C67EE9119084C99B2E87B7B0
Original Document ID            : xmp.did:84F62D68C67EE9119084C99B2E87B7B0
Color Mode                      : RGB
ICC Profile Name                : sRGB IEC61966-2.1
History Action                  : created
History Instance ID             : xmp.iid:84F62D68C67EE9119084C99B2E87B7B0
History When                    : 2019:05:25 10:23:42+02:00
History Software Agent          : Adobe Photoshop CS5 Windows

Ekkor tehát csak az XMP vonatkozású mezőket és értékeket listázza ki.

A parancssorban a -XMP kapcsoló után lévő ":all" utótag gondoskodik az összes mező szöveges formában történő kilistázásáról. Enélkül ugyanis bináris adatként adja ki az XMP (vagy bármelyik több mezőből álló) rekordot, amit például fájlba irányítva más programokkal dolgozhatunk fel, stb.

Vagy például az Exif csoportot is lekérdezhetjük hasonlóan:

exiftool -Exif:all proba_ps.jpg
Orientation                     : Horizontal (normal)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Software                        : Adobe Photoshop CS5 Windows
Modify Date                     : 2019:05:25 10:23:42
Color Space                     : sRGB
Exif Image Width                : 1024
Exif Image Height               : 768
Compression                     : JPEG (old-style)
Thumbnail Offset                : 314
Thumbnail Length                : 920
Thumbnail Image                 : (Binary data 920 bytes, use -b option to extract)
Az Exiftool oldalán tájékozódhatunk az összes kezelhető strukturált adatcsoportról, amiket lekérhetünk a programmal, továbbá az összes támogatott fájlformátumról is kaphatunk bővebb információt.

Egyedi mezők

Egyedi mezők kiolvasására is van lehetőség, ha például automatizált feldolgozó scriptet kellene készítenünk bizonyos adatmezők kiértékeléséhez, stb.

A parancssorban használatos mezőnevek a legtöbbször nem egyeznek a kilistázott nevekkel, ezért a szükséges mezőnevekről mindig tájékozódjunk az adott strukturált adatcsoport leírásában, mint például az XMP, GPS, IPTC, EXIF, stb. Ezek természetesen nem csak a JPG képfájlokra vonatkoznak, hanem a program által kezelt többi fájlformátumra is.

Ezek fényében kényelmesen kiolvashatjuk például valamelyik jpg példánkból a kép felbontását:

exiftool -Imagesize proba_ps.jpg
Image Size                      : 1024x768

De akár egyszerre több mezőt is lekérhetünk, például külön az exif szélességet és külön a magasságot:

exiftool -ExifImageWidth -ExifImageHeight proba_ps.jpg
Exif Image Width                : 1024
Exif Image Height               : 768

És így tovább, bármennyi egyedi mezőt kérhetünk le.

 

 

Adatok formázása

A kért információt sokféleképpen formázhatjuk, így rugalmasan fel tudjuk használni saját feladatainkban, programjainkban.

JSON forma

A legutóbbi példánál maradva, ha mondjuk JSON formában lenne szükségünk az adatokra, akkor szúrjuk be a -j kapcsolót az előző parancsunkba:

exiftool -j -ExifImageWidth -ExifImageHeight proba_ps.jpg

És JSON-ban kapjuk az eredményt, amit már bármelyik általunk használt programnyelvből könnyen felhasználhatunk:

[{
  "SourceFile": "proba_ps.jpg",
  "ExifImageWidth": 1024,
  "ExifImageHeight": 768
}]
Dupla soros forma

Ha olyan helyzetben vagyunk, hogy csak natív Bash utasításokkal dolgozhatunk – ahol nem állnak rendelkezésre külső JSON feldolgozó programok –, akkor használjuk az -l kapcsolót (kicsi L) a korábbi -j helyett:

exiftool -l -ExifImageWidth -ExifImageHeight proba_ps.jpg

Ekkor dupla soros változatban kapjuk meg a mezőnév és érték párokat:

Exif Image Width
      1024
Exif Image Height
      768

Ezt pedig már a Bash ciklusaival és tömb struktúrájával könnyedén ráncba szedhetjük a sortörések kihasználásával.

PHP tömb forma

Ha PHP-ben szeretnénk feldolgozni a kapott adatokat, akkor használjuk a -php kapcsolót:

exiftool -php -ExifImageWidth -ExifImageHeight proba_ps.jpg

Ekkor pedig egy PHP tömb alakjában juthatunk hozzá az értékekhez:

Array(Array(
  "SourceFile" => "proba_ps.jpg",
  "ExifImageWidth" => 1024,
  "ExifImageHeight" => 768
));

amit aztán egyszerűen kiértékelve valódi PHP tömbbé alakíthatunk.

Az Exiftool ezeken kívül tartalmaz még számos kimeneti formázási lehetőséget, ezekről célszerű a parancs manual oldalán tájékozódni.

 

A következő oldalon folytatjuk az exiftool parancs írási funkciójával...

 

 

Lapozó

Ez a leírás több oldalból áll: