GOOGLE ADS

Freitag, 29. April 2022

Gibt es mit PHP ImageMagick eine Möglichkeit, die Anzahl der Seiten in einer TIF-Bilddatei zu zählen, ohne die vollständige Datei zu laden?

Lassen Sie mich das Szenario beschreiben.

Umgebung: RedHat Linux 7.9 + ImageMagick* + pecl imagick + PHP-Skript.

Geltungsbereich: In der GUI-Anwendung muss der Benutzer berechtigt sein, die einzelnen Bilder aus einer Multi-TIF-Datei zu sehen.

Datei: Multi-Tiff-Dateien sind JPEG-komprimiert.

Problem:
Ich habe eine TIF-Datei, die N Bilder mit einer Gesamtgröße von wenigen MB bis 1/2 GB enthält, und ich muss so viel schneller wie möglich auf zwei Arten darauf zugreifen:

  • [ KO ] Notwendigkeit, die Gesamtzahl der in TIF enthaltenen Bilder zu zählen.

    $img = new Imagick($filename); $img->getNumberImages();

    Bei dieser Art des Zugriffs benötigt die PHP-Klasse ziemlich lange, um ein TIF mit ~2612 Bildern zu laden, etwa 498 MB, etwa 15 Sekunden (unkomprimiertes TIF ist etwa 1,3 GB).


  • [ OK ] Zugriff auf das #n-Bild in TIF, damit der Benutzer jedes einzelne Bild sehen kann.

    $img = new Imagick($filename."[1]");$img->setImageFormat("jpeg"); $thumbnail = $img->getImageBlob();

    Es ist ' OK ', weil die Geschwindigkeit für das Zielfernrohr hoch ist (immer weniger als (und weit entfernt von) 1 Sekunde)


  • ** Sowohl Punkt 1/2 wurde mit verschiedenen Versionen der imagick-Bibliothek getestet: 6.7.8-9, 6.9.10-68 Q16, 7.1.0 (Q16 HDRI) [pecl imagick 3.4 oder 3.7] + GraphicsMagick-1.3.36, aber es gibt keinen sinnvollen unterschied.

    Gibt es eine Alternative, um die Anzahl der Bilder in TIF zu erhalten, ohne Zeit zu verwenden, um das vollständige TIF mit der Imagick-PHP-Klasse zu initialisieren?


    Lösung des Problems

    Mir ist klar, dass Sie nach imagemagick gefragt haben, aber php-vips kann dies ziemlich schnell tun. Ich habe es versucht:

    #!/usr/bin/env php
    <?php
    require __DIR__. '/vendor/autoload.php';
    use Jcupitt\Vips;
    if(count($argv)!= 4) {
    echo("usage:./page.php input-image output-image page-number\n");
    exit(1);
    }
    // open and check the number of pages
    $image = Vips\Image::newFromFile($argv[1]);
    $n_pages = $image->get("n-pages");
    echo("image $argv[1] has $n_pages pages\n" );
    // grab a specific page
    $page = Vips\Image::newFromFile($argv[1], ["page" => intval($argv[3])]);
    echo("page $argv[3] is {$page->width} by {$page->height} pixels\n" );
    // thumbnail the page to 500 pixels across and save as jpg
    echo("thumbnailing...\n");
    $thumb = $page->thumbnail_image(500);
    $thumb->writeToFile($argv[2]);
    echo("done\n");

    Ich verstehe:

    $ time./page.php ~/pics/openslide/CMU-1.tif x.jpg 5
    image /home/john/pics/openslide/CMU-1.tif has 10 pages
    page 5 is 1437 by 1028 pixels
    thumbnailing...
    done
    real 0m0.093s
    user 0m0.123s
    sys 0m0.021s

    Ich habe es jedoch nicht auf einem TIFF mit 2.600 Seiten versucht.

    Keine Kommentare:

    Kommentar veröffentlichen

    Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

    Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...