TIFF inlezen met Image Magick ondanks fouten
De TIFF-bestanden zijn ooit opgeslagen met programma's als PhotoShop 3. Maar een flink deel van die TIFF-bestanden hebben foute waarden in metadata, volgens Image Magick en ook volgens GIMP.
Bij het omzetten met de CLI-tool 'convert' krijg ik foutmeldingen als '0 is een foute waarde voor OrientationTag' en andere meldingen, maar in GIMP kan ik die meldigen negeren en de afbeelding toch openen. Als ik afbeeldingen opnieuw opsla met GIMP, zijn ze wel te openen met ImageMagick.
Daarom dacht ik de bestanden met PHP om te zetten, misschien heeft de ImageMagick-extentie de library anders geïmplementeerd waardoor ik geen last zou hebben van errors, zoals met het voorbeeld in dit topic. Helaas verschijnen de errors in stderr en wordt de TIFF niet in PHP geopend.
Net heb ik geprobeerd om dan die duizenden TIFFs om te zetten met BIMP, een batch processor voor GIMP, maar die crasht al na een paar honderd TIFFs. Het laatste redmiddel is om het met de hand te doen, maar voor meer dan 10-duizend TIFFs ben ik daar te veel tijd aan kwijt.
Weet iemand een manier waarop ik Imagick toch zo ver kan krijgen om de foute metadata te negeren en toch de TIFF-bestanden in te lezen ?
https://www.learngoogle.com/2013/10/01/removing-exif-data-with-imagemagick/
https://somedudesays.com/2019/11/using-imagemagick-and-exiv2-to-get-and-clear-exif-data-on-linux/
De foto's zijn niet gemaakt met digitale camera's die EXIF-data invoegen, maar met negatiefscanners. De metadata bevat niet zo zeer data als GPS-locatie, maar vooral data als maten, kleurprofielen, dat soort dingen. Als ik "man mogrify | grep -strip" doe, lees ik:
Is het middel dan niet erger dan de kwaal? (Als mogrify de TIFF-bestanden wel kan lezen?)
Ik heb ook nog even verder gekeken, in de documentatie op php.net valt er bijna niets te configureren vanuit PHP. Hopelijk kan ik nog ergens anders iets instellen ?
Toevoeging op 07/03/2023 13:06:26:
Toch even geprobeerd:
Code (php)
1
2
3
2
3
# mogrify foto.tif -orient bottom-left
mogrify-im6.q16: Unknown field with tag 32768 (0x8000) encountered. `TIFFReadDirectory' @ warning/tiff.c/TIFFWarnings/985.
mogrify-im6.q16: foto.tif: Bad value 0 for "Orientation" tag. `_TIFFVSetField' @ error/tiff.c/TIFFErrors/606.
mogrify-im6.q16: Unknown field with tag 32768 (0x8000) encountered. `TIFFReadDirectory' @ warning/tiff.c/TIFFWarnings/985.
mogrify-im6.q16: foto.tif: Bad value 0 for "Orientation" tag. `_TIFFVSetField' @ error/tiff.c/TIFFErrors/606.
Toevoeging op 07/03/2023 13:29:56:
Joepie, progressie!
Met de CLI-tool exiv2 is de EXIF-data te bewerken van de TIFF-bestanden die niet door Image Magick kunnen worden geladen.
Code (php)
1
2
3
2
3
apt install exiv2
exiv2 -pt foto.tif | grep Orientation
Exif.Image.Orientation Short 1 (0)
exiv2 -pt foto.tif | grep Orientation
Exif.Image.Orientation Short 1 (0)
Dit demonstreert het probleem: de waarde 0 wordt niet genegeerd, maar gezien als error. Volgens de specs kan dit alleen een waarde zijn tussen 1 en 8, waarbij 1 standaard is:
Na het aanpassen van de waarde met exiv2 kan hetbestand wel geladen worden met Image Magick:
Nu nog een manier zien te vinden om de juiste foutmelding van Imagick te koppelen aan de juiste fix (via exec() )... ah, daar is het al:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
function laad($path, $file) {
try {
$im = new Imagick($path . $file);
return $im;
} catch (ImagickException $e) {
$err = $e->getMessage();
$output=null;
$retval=null;
if (strpos($err, 'Bad value 0 for "Orientation" tag') !== FALSE) {
$cmd = 'exiv2 -M"set Exif.Image.Orientation Short 1" '
. escapeshellarg($path . $file);
exec($cmd, $output, $retval);
if ($retval === FALSE) {
print "Kan orientatiefout niet herstellen voor " . $file . PHP_EOL;
return FALSE;
} else {
print "Orientatiefout hersteld voor " . $file . PHP_EOL;
return laad($path, $file);
}
} else {
print $err . PHP_EOL;
return FALSE;
}
}
}
?>
function laad($path, $file) {
try {
$im = new Imagick($path . $file);
return $im;
} catch (ImagickException $e) {
$err = $e->getMessage();
$output=null;
$retval=null;
if (strpos($err, 'Bad value 0 for "Orientation" tag') !== FALSE) {
$cmd = 'exiv2 -M"set Exif.Image.Orientation Short 1" '
. escapeshellarg($path . $file);
exec($cmd, $output, $retval);
if ($retval === FALSE) {
print "Kan orientatiefout niet herstellen voor " . $file . PHP_EOL;
return FALSE;
} else {
print "Orientatiefout hersteld voor " . $file . PHP_EOL;
return laad($path, $file);
}
} else {
print $err . PHP_EOL;
return FALSE;
}
}
}
?>