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();
}

?>

添加注释

用户贡献的注释 6 个注释

dennis at gofolo dot com
14 年前
需要进行大量调整大小操作,我需要了解不同调整大小滤镜的速度。
这是将 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 的效果非常相似,但速度明显更快。
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();
}
}
}

?>
andrabr at gmail dot com
16 年前
模糊:> 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();

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

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

结构不良,因此 IMO 具有误导性。是的,对于按比例缩放,您将 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 可能会更好,因为它似乎更高效得多。
Spitfires
12 年前
为了避免在使用 "bestfit" 参数时进行上采样,请在调整大小之前检查图像尺寸

<?php
$image
= new Imagick( $filename );
$imageprops = $image->getImageGeometry();
if (
$imageprops['width'] <= 200 && $imageprops['height'] <= 200) {
// 不要上采样
} else {
$image->resizeImage(200,200, imagick::FILTER_LANCZOS, 0.9, true);
}
?>
To Top