Imagick 不转换大型 .tif 文件

Imagick not converting large .tif files

我正在使用 Imagick 将大型 .tif 图像转换为 jpeg。由于某些原因,当 .tif 文件大于 4GB 时,使用 Imagick 的功能不起作用。当文件小于 4GB 时,没有问题。它不显示任何消息,它只是永远保持 运行。我已经等了好几天了,它永远不会结束。

版本:ImageMagick 6.9.10-23

<?php
// Function used to create Thumbnail
function CreateThumbnail($sourcePath, $destPath, $fileExtension)
{
    $maxCoreNum = 4; // set maximum number of cores
    
    if (strtoupper($fileExtension) == "TIF" || strtoupper($fileExtension) == "TIFF") {
        $tempPath = str_replace("thumb.jpg", "temp.tif", $destPath);

        $command = 'gdal_translate -co "TILED=YES" -co "COMPRESS=LZW" -co "BIGTIFF=IF_NEEDED" -ot Byte -scale "' . $sourcePath . '" "' . $tempPath . '"  2>&1';

        exec($command, $output);

        $image = new Imagick($tempPath);

        $image->setImageColorspace(255);
        $image->setCompression(Imagick::COMPRESSION_JPEG);
        $image->setCompressionQuality(60);
        $image->setResourceLimit(4, $maxCoreNum); //Set maximum number of cores to use with ImageMagick
        $image->setImageBackgroundColor('white');
        $image->setImageAlphaChannel(11); // Use this instead.
        $image = $image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); // Use this instead.

        $image->setImageFormat('jpeg');

        $image->resizeImage(300, 0, Imagick::FILTER_UNDEFINED, 1);
        $image->writeImage($destPath);

        $command = 'rm "' . $tempPath . '"';
        exec($command);


    } elseif (strtoupper($fileExtension) == "GIF" || strtoupper($fileExtension) == "JPG" || strtoupper($fileExtension) == "JPEG" || strtoupper($fileExtension) == "PNG") {
        $image = new Imagick($sourcePath);

        $image->setCompressionQuality(60);
        $image->setResourceLimit(4, $maxCoreNum); //Set maximum number of cores to use with ImageMagick

        $image->setImageFormat('jpeg');

        $image->resizeImage(300, 0, Imagick::FILTER_UNDEFINED, 1);
        $image->writeImage($destPath);
    }
}

我知道你问过 imagick,这可能没有用,但我帮助维护 php-vips,一个专为超大图像设计的图像处理库。你的大 TIFF 应该没有问题。例如:

#!/usr/bin/php
<?php
require __DIR__ . '/vendor/autoload.php';
use Jcupitt\Vips;

// fast thumbnail generator
$image = Vips\Image::thumbnail($argv[1], 128);
$image->writeToFile($argv[2]);

将制作一张 128x128 的图像缩略图。我可以 运行 像这样在一个巨大的 TIFF 上:

$ vipsheader ~/pics/x.tif
/home/john/pics/x.tif: 108199x81503 uchar, 3 bands, srgb, tiffload
$ /usr/bin/time -f %M:%e 3./try1.php ~/pics/x.tiff y.jpg
164840:579.02

因此,在这台普通的笔记本电脑上,它在大约 10 分钟内缩略了 108,000 x 82,000 像素的 TIFF,并且需要 160MB 的 RAM 峰值。该图像是平铺和 JPEG 压缩的,您显然会看到与其他 TIFF 类型不同的性能。

文档中有一章是关于缩略图操作以及如何充分利用它的。

https://libvips.github.io/libvips/API/current/Using-vipsthumbnail.md.html

php-vips API 文档在这里:

https://libvips.github.io/php-vips/docs/classes/Jcupitt-Vips-Image.html