TIFF inlezen met Image Magick ondanks fouten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ad Fundum

Ad Fundum

07/03/2023 12:23:48
Quote Anchor link
Met Image Magick lees ik duizenden TIFF bestanden in, om ze te kunnen omzetten naar een web-formaat.
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 ?
 
PHP hulp

PHP hulp

19/03/2024 09:57:14
 
Ozzie PHP

Ozzie PHP

07/03/2023 12:30:12
 
Ad Fundum

Ad Fundum

07/03/2023 12:45:10
Quote Anchor link
Dank voor het meedenken!

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
-strip               strip image of all profiles and comments

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)
PHP script in nieuw venster Selecteer het PHP script
1
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.


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
apt install exiv2
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
0x0112     Orientation     int16u     IFD0     1 = Horizontal (normal)

Na het aanpassen van de waarde met exiv2 kan hetbestand wel geladen worden met Image Magick:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
exiv2 -M"set Exif.Image.Orientation Short 1" foto.tif

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
    }
  }
}

?>
Gewijzigd op 07/03/2023 14:04:20 door Ad Fundum
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.