PHP Imagick 调整 Gif 帧大小有奇怪的问题
PHP Imagick Resizing Gif frames has weird issues
我正在尝试调整 gif 的所有帧的大小,有时它们变得非常奇怪。
我看过使用命令行的示例,现在我想尝试避免这种情况。
原文:
调整大小:
问题你看清楚了
现在我的代码:
$imgBlob = file_get_contents(__DIR__ . '/../assets/test_gif.gif');
if ($imgBlob === false) {
echo 'img blob failed!' . PHP_EOL;
return;
}
$img = new Imagick();
$img->readImageBlob($imgBlob);
$img->coalesceImages();
$count = 0;
foreach ($img as $_img) {
// $_img->coalesceImages();
$imgWidth = $_img->getImageWidth();
$imgHeight = $_img->getImageHeight();
$ratio = $imgHeight / $imgWidth;
$resizeWidth = 200;
$resizeHeight = 300;
if ($ratio > 0) {
$resizeWidth = round($resizeHeight / $ratio, 0);
} else {
$resizeHeight = round($resizeWidth / $ratio, 0);
}
//if ($_img->adaptiveResizeImage($resizeWidth, $resizeHeight) === false) {
if ($_img->resizeImage($resizeWidth, $resizeHeight, Imagick::FILTER_CATROM, 1, 0) === false) {
echo 'FAILED' . PHP_EOL;
}
$count++;
}
$thumbnailOnDisk = __DIR__ . '/../assets/test_resized.gif';
if (file_exists($thumbnailOnDisk)) {
unlink($thumbnailOnDisk);
}
$img = $img->deconstructImages();
if ($count > 1) {
$file = $img->writeImages($thumbnailOnDisk, true);
} else {
$file = $img->writeImage($thumbnailOnDisk);
}
echo 'DONE' . PHP_EOL;
不确定 coalesceImages 或 deconstructImages 到底在做什么,我很难在网上找到可以解决我的问题的示例。
$img->coalesceImages();
Returns 一个 imagick 对象,我正在丢弃它。
$img = $img->coalesceImages();
有效。
在调整图片大小时,您还需要设置图片页面的大小。
http://php.net/manual/en/imagick.setimagepage.php
我曾经读到过,在某些情况下,gif 的 header 可能不会显示正确的图像大小。这就是为什么以任何方式设置图像页面都是有用的。
示例:
`$image->resizeImage(120, 110, imagick::FILTER_CATROM, 1);
// Set the page size
$image->setImagePage(120, 110, 0, 0);
我正在尝试调整 gif 的所有帧的大小,有时它们变得非常奇怪。
我看过使用命令行的示例,现在我想尝试避免这种情况。
原文:
调整大小:
问题你看清楚了
现在我的代码:
$imgBlob = file_get_contents(__DIR__ . '/../assets/test_gif.gif');
if ($imgBlob === false) {
echo 'img blob failed!' . PHP_EOL;
return;
}
$img = new Imagick();
$img->readImageBlob($imgBlob);
$img->coalesceImages();
$count = 0;
foreach ($img as $_img) {
// $_img->coalesceImages();
$imgWidth = $_img->getImageWidth();
$imgHeight = $_img->getImageHeight();
$ratio = $imgHeight / $imgWidth;
$resizeWidth = 200;
$resizeHeight = 300;
if ($ratio > 0) {
$resizeWidth = round($resizeHeight / $ratio, 0);
} else {
$resizeHeight = round($resizeWidth / $ratio, 0);
}
//if ($_img->adaptiveResizeImage($resizeWidth, $resizeHeight) === false) {
if ($_img->resizeImage($resizeWidth, $resizeHeight, Imagick::FILTER_CATROM, 1, 0) === false) {
echo 'FAILED' . PHP_EOL;
}
$count++;
}
$thumbnailOnDisk = __DIR__ . '/../assets/test_resized.gif';
if (file_exists($thumbnailOnDisk)) {
unlink($thumbnailOnDisk);
}
$img = $img->deconstructImages();
if ($count > 1) {
$file = $img->writeImages($thumbnailOnDisk, true);
} else {
$file = $img->writeImage($thumbnailOnDisk);
}
echo 'DONE' . PHP_EOL;
不确定 coalesceImages 或 deconstructImages 到底在做什么,我很难在网上找到可以解决我的问题的示例。
$img->coalesceImages();
Returns 一个 imagick 对象,我正在丢弃它。
$img = $img->coalesceImages();
有效。
在调整图片大小时,您还需要设置图片页面的大小。
http://php.net/manual/en/imagick.setimagepage.php
我曾经读到过,在某些情况下,gif 的 header 可能不会显示正确的图像大小。这就是为什么以任何方式设置图像页面都是有用的。
示例:
`$image->resizeImage(120, 110, imagick::FILTER_CATROM, 1);
// Set the page size
$image->setImagePage(120, 110, 0, 0);