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