PHP Conference Japan 2024

Imagick::resizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::resizeImage缩放图像

描述

public Imagick::resizeImage(
    int $columns,
    int $rows,
    int $filter,
    float $blur,
    bool $bestfit = false,
    bool $legacy = false
): bool

使用 滤镜 将图像缩放至所需的尺寸。

注意: 参数 bestfit 的行为在 Imagick 3.0.0 中发生了改变。在此版本之前,给定尺寸为 400x400,尺寸为 200x150 的图像将保持不变。在 Imagick 3.0.0 及更高版本中,图像将被放大到 400x300 的尺寸,因为这是给定尺寸的“最佳匹配”。如果使用了 bestfit 参数,则必须同时给出宽度和高度。

参数

columns

图像宽度

rows

图像高度

filter

请参考 滤镜常量列表

blur

模糊因子,> 1 为模糊,< 1 为清晰。

bestfit

可选的拟合参数。

返回值

成功时返回 true

变更日志

版本 描述
PECL imagick 2.1.0 添加了可选的拟合参数。此方法现在支持比例缩放。将零作为任一参数传递以进行比例缩放。

示例

示例 #1 Imagick::resizeImage()

<?php
function resizeImage($imagePath, $width, $height, $filterType, $blur, $bestFit, $cropZoom) {
//模糊因子,> 1 为模糊,< 1 为清晰。
$imagick = new \Imagick(realpath($imagePath));

$imagick->resizeImage($width, $height, $filterType, $blur, $bestFit);

$cropWidth = $imagick->getImageWidth();
$cropHeight = $imagick->getImageHeight();

if (
$cropZoom) {
$newWidth = $cropWidth / 2;
$newHeight = $cropHeight / 2;

$imagick->cropimage(
$newWidth,
$newHeight,
(
$cropWidth - $newWidth) / 2,
(
$cropHeight - $newHeight) / 2
);

$imagick->scaleimage(
$imagick->getImageWidth() * 4,
$imagick->getImageHeight() * 4
);
}


header("Content-Type: image/jpg");
echo
$imagick->getImageBlob();
}

?>

添加注释

用户贡献的注释 5 条注释

dennis at gofolo dot com
15 年前
由于需要进行大量的图像缩放,我需要了解不同缩放滤镜的速度。
以下是将 5906x5906 JPEG 图像缩放到 1181x1181 所花费的时间。

FILTER_POINT 耗时:0.334532976151 秒
FILTER_BOX 耗时:0.777871131897 秒
FILTER_TRIANGLE 耗时:1.3695909977 秒
FILTER_HERMITE 耗时:1.35866093636 秒
FILTER_HANNING 耗时:4.88722896576 秒
FILTER_HAMMING 耗时:4.88665103912 秒
FILTER_BLACKMAN 耗时:4.89026689529 秒
FILTER_GAUSSIAN 耗时:1.93553304672 秒
FILTER_QUADRATIC 耗时:1.93322920799 秒
FILTER_CUBIC 耗时:2.58396601677 秒
FILTER_CATROM 耗时:2.58508896828 秒
FILTER_MITCHELL 耗时:2.58368492126 秒
FILTER_LANCZOS 耗时:3.74232912064 秒
FILTER_BESSEL 耗时:4.03305602074 秒
FILTER_SINC 耗时:4.90098690987 秒

我最终选择了 CATROM,因为它与 LANCZOS 的结果非常相似,但速度明显更快。
andrabr at gmail dot com
17 年前
blur: > 1 为模糊,< 1 为清晰

创建漂亮的缩略图(LANCZOS 是最慢的滤镜)

<?php

$thumb
= new Imagick();
$thumb->readImage('myimage.gif'); $thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('mythumb.gif');
$thumb->clear();
$thumb->destroy();

?>

或者,相同内容的简短版本

<?php

$thumb
= new Imagick('myimage.gif');

$thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('mythumb.gif');

$thumb->destroy();

?>
phper at krzysiu dot net
8 年前
某些尺寸、图像、滤镜和模糊的组合会导致出现伪影,甚至使图像完全乱码。据我所知,当模糊值小于 0.25(有时更小)时就会发生这种情况,并且随着模糊值接近 0(黑色图像)而变得更糟。有时只有某些值会产生伪影,例如使用我的测试图像的 Hanning 滤镜:0.0 模糊正常,0.1 会产生伪影。

受影响的滤镜例如 Catrom、sinc、cubic、quadratic,而不受影响的滤镜例如 Lanczos 和 Hanning。问题似乎在于滤镜算法的域,而不是 IMagick 的实现。此图像显示了三种滤镜:http://i.imgur.com/HcdwoUS.jpg

有时测试图像看起来可能没问题,但有时不行,因此,如果您正在使用受影响的滤镜,则 0.5 值应该是安全的。

此测试脚本采用示例图像(您可以下载并使用 http://i.imgur.com/KsTJpFr.jpg,它会受到影响)并在同一目录中为每个滤镜和四个模糊值之一创建调整大小的图像,命名方式类似于“test.jpg.sinc.0.1.jpg”(对于“test.jpg”输入)。

<?php
$imgPath
= 'imgtest/test.jpg'; // 设置您的图像文件
$testBlurs = [0, 0.1, 0.2, 0.5]; // 测试这些模糊值
$im = new IMagick();
$im->readImage($imgPath);

foreach ((new
ReflectionClass('IMagick'))->getConstants() as $n => $f) {
if (
strncmp($n, 'FILTER_', 7) === 0) { // 获取可用的 IMagick 滤镜
$filterName = strtolower(substr($n, 7)); // 从常量中提取滤镜名称
foreach ($testBlurs as $blur) {
$imSize = clone $im;
$imSize->resizeImage(500, 500, $f, $blur, true);
$imSize->writeImage(sprintf("%s-%s-%.1f.jpg", $imgPath, $filterName, $blur));
$imSize->destroy();
}
}
}

?>
Spitfires
12 年前
更改日志注释

"2.1.0 添加了可选的 fit 参数。此方法现在支持比例缩放。将零作为任一参数传递以进行比例缩放。"

结构不佳,因此在我看来具有误导性。是的,对于比例缩放,您将 0 作为任一参数传递... 但是如果使用可选的 fit 参数,则*并非*如此。当 bestfit == true 时,您必须为列和行指定*非零*值。请注意,它*仍然*会按比例缩放,例如

Imagick::resizeImage ( 200, 200, imagick::FILTER_LANCZOS, 1, TRUE)

会将 1000x750 的图像调整大小为 200x150

因此,对于比例调整大小
不使用“bestfit”
Imagick::resizeImage ( 200, 0, imagick::FILTER_LANCZOS, 1)

使用“bestfit”
Imagick::resizeImage ( 200, 200, imagick::FILTER_LANCZOS, 1, TRUE)
jdhawk at gmail dot com
13 年前
在我们的 Linux 环境中,使用任何滤镜的 resizeImage 在进行批量调整大小时会产生极高的 CPU 利用率(在 40-50% 的范围内)。

我们切换到 scaleImage,它产生的结果类似于 FILTER_BOX,并且 CPU 利用率下降到 2-3%。

使用 XHProf 对这两个批处理作业进行分析显示 CPU 时间显着减少,因此,如果您要进行大量图片调整大小,则可能有利于使用 scaleImage 而不是 resizeImage,因为它似乎效率更高得多。
To Top