PHP Conference Japan 2024

Imagick::thumbnailImage

(PECL imagick 2, PECL imagick 3)

Imagick::thumbnailImage更改图像尺寸

说明

public Imagick::thumbnailImage(
    int $columns,
    int $rows,
    bool $bestfit = false,
    bool $fill = false,
    bool $legacy = false
): bool

更改图像尺寸到给定的大小并移除所有关联的 profile 文件。其目标是生成适合在 Web 上显示的小尺寸、低成本缩略图。如果第三个参数为 true,则 columns 和 rows 参数将用作各边的最大值。两边都会按比例缩小,直到它们匹配或小于为该边指定的参数。

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

参数

columns

图像宽度

rows

图像高度

bestfit

是否强制使用最大值

返回值

成功时返回 true

错误/异常

错误时抛出 ImagickException。

范例

示例 #1 Imagick::thumbnailImage()

<?php
function thumbnailImage($imagePath) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->setbackgroundcolor('rgb(64, 64, 64)');
$imagick->thumbnailImage(100, 100, true, true);
header("Content-Type: image/jpg");
echo
$imagick->getImageBlob();
}

?>

添加注释

用户贡献的注释 7 条

up
10
匿名
12 年前
如果第三个参数为 true,则图像将以其被包含在所提及的尺寸范围内的方式调整大小。
这就像更改图像的尺寸,以便它可以包含在给定尺寸的框中。

例如:图像的尺寸为 1600*800。如果我们使用 thumbnailImage(400, 400, true),则新图像的尺寸将为 400*200。

此页面中的一些先前注释提到图像按比例调整大小,以使其 _最小_ 尺寸与指定的宽度或高度匹配,而不是两者都匹配。
但现在情况并非如此。图像的宽度和高度都将 <= thumbnailImage() 中提到的值。
也许 imagick 更改/更新了此功能。
up
14
jarrod at jarrodchristman dot com
13 年前
尽管 thumbnailImage 旨在生成最小文件大小的图像,但我发现它没有。我将此代码放在一起并围绕不同的压缩设置,发现它生成的文件大小最小

<?php
// 最大垂直或水平分辨率
$maxsize=550;

// 创建新的 Imagick 对象
$image = new Imagick('输入图像文件名和位置');

// 调整为宽度或高度中较大的那个
if($image->getImageHeight() <= $image->getImageWidth())
{
// 根据宽度使用 lanczos 重采样算法调整图像大小
$image->resizeImage($maxsize,0,Imagick::FILTER_LANCZOS,1);
}
else
{
// 根据高度使用 lanczos 重采样算法调整图像大小
$image->resizeImage(0,$maxsize,Imagick::FILTER_LANCZOS,1);
}

// 设置为使用 jpeg 压缩
$image->setImageCompression(Imagick::COMPRESSION_JPEG);
// 设置压缩级别(1 最低质量,100 最高质量)
$image->setImageCompressionQuality(75);
// 剥离不需要的元数据
$image->stripImage();
// 将结果图像写入输出目录
$image->writeImage('输出图像文件名和位置');
// 销毁 Imagick 对象,释放过程中分配的资源
$image->destroy();

?>

我发现 setCompression 根本不起作用,必须使用 setImageCompression。需要 stripImage 调用并剥离不需要的元数据。您可以选择任何您想要的滤镜,但我发现 lanczos 最适合图像缩小,尽管它的计算量更大。
up
9
web at johnbaldock dot com
12 年前
缩小 jpg 时,如果使用 <?php $image->setOption('jpeg:size', '800x532') ?>,则可以将性能提高一倍以上,将 800x532 替换为您希望最终图像达到的分辨率。例如,而不是这个

<?php
$image
= new Imagick('foo.jpg');
?>

您将使用这个

<?php
$image
= new Imagick();
$image->setOption('jpeg:size', '800x532');
$image->readImage('foo.jpg');
?>
up
3
匿名用户
16 年前
以下是一个计算缩略图新尺寸的函数,以使其在两个方向上都符合给定的尺寸。

<?php
/**
* 计算符合新约束条件的新图像尺寸
*
* @param 原始 X 尺寸(以像素为单位)
* @param 原始 Y 尺寸(以像素为单位)
* @return 新的最大 X 尺寸(以像素为单位)
* @return 新的最大 Y 尺寸(以像素为单位)
*/
function scaleImage($x,$y,$cx,$cy) {
// 将默认的新值设置为旧值,以防图像甚至不需要缩放
list($nx,$ny)=array($x,$y);

// 如果图像总体上较小,则无需进行处理
if ($x>=$cx || $y>=$cx) {

// 计算比例
if ($x>0) $rx=$cx/$x;
if (
$y>0) $ry=$cy/$y;

// 使用最低的比例,以确保不超过所需的图像尺寸
if ($rx>$ry) {
$r=$ry;
} else {
$r=$rx;
}

// 根据选择的比例计算新尺寸
$nx=intval($x*$r);
$ny=intval($y*$r);
}

// 返回结果
return array($nx,$ny);
}
?>
这样使用它:

<?php
// 读取原始图像并创建 Imagick 对象
$thumb=new Imagick($originalImageFilename);

// 计算新尺寸
list($newX,$newY)=scaleImage(
$thumb->getImageWidth(),
$thumb->getImageHeight(),
$newMaximumWidth,
$newMaximumHeight);

// 缩放图像
$thumb->thumbnailImage($newX,$newY);

// 将新图像写入文件
$thumb->writeImage($thumbnailFilename);
?>
up
-2
n-sw-bit 在 ya 点 ru
16 年前
如果你想调整你的图片以适应最小的参数

$fitbyWidth = (($maxWidth/$w)<($maxHeight/$h)) ?true:false;

if($fitbyWidth){
$im->thumbnailImage($maxWidth, 0, false);
}else{
$im->thumbnailImage(0, $maxHeight, false);
}
up
-1
raybdbomb . gmail
17 年前
如此处所述
https://php.net/manual/zh/ref.imagick.php
将任一参数设置为 0,则保持纵横比。
up
-4
sgarner 在 expio 点 co 点 nz
17 年前
当 $fit == true 时,图像将按比例调整大小,以使其_最小_尺寸与指定的宽度或高度匹配,而不是两者都匹配。

例如,如果你说 thumbnailImage(400, 400, true),对于 1600x800 的图像,它将被调整为 800x400,而不是你可能期望的 400x200。

解决方法是将原始图像的尺寸与指定的尺寸进行比较,并将较小的尺寸替换为零,并将 $fit = false。

即:thumbnailImage(400, 0, false) 会将 1600x800 的图像调整为 400x200。
To Top