【发布时间】: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。