【问题标题】:Imagick not converting large .tif filesImagick 不转换大的 .tif 文件
【发布时间】:2020-12-03 15:00:50
【问题描述】:

我正在使用 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);
    }
}

【问题讨论】:

  • “更小”有多小?你见过 3GB 或 2GB 的文件会发生什么吗? 4GB 是图像的 巨大 大小。你等了多久才完成?如果你从命令行运行它,你会得到相同的结果吗?
  • @RoAchterberg 较小的意思是文件
  • 所以你是说一个大小为 3.9GB 的文件是否完整了?听起来你需要做一些更仔细的测试。尝试以 0.5GB 为增量逐步增加大小,看看它在哪里阻塞。
  • 顺便说一句,这到底是什么图像?你真的需要它那么大吗?如果您正在寻找分辨率,或许可以寻找基于矢量的格式?
  • 检查您的资源限制并编辑您的 policy.xml 文件以了解图像宽度。如果这是某个托管公司的共享服务器,那么他们可能会受到限制,他们必须对 policy.xml 文件进行编辑。 convert -list resource 会告诉你你的局限性。还要确保您安装了具有 BigTIFF 兼容性的当前 libtiff。

标签: php imagick


【解决方案1】:

我知道您询问了 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

【讨论】:

  • 我使用的实际命令是 vipsthumbnail file.tif -o "file.jpg[background=255 255 255]" --size=300 这将创建一个 300x300 的白色背景 jpg 图片。
  • 嗯,好的。如果你愿意,你应该可以使用vipsthumbnail file.tif -o file.jpg[background=255] --size=300,它稍微简单一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多