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

将图像大小更改为给定的尺寸并删除任何关联的配置文件。 目标是生成适合在 Web 上显示的小型、低成本缩略图。 如果将true 作为第三个参数提供,则列和行参数将用作每边的最大值。 两侧都将缩放到匹配或小于为该侧提供的参数。

注意: 参数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 个注释

10
匿名
12 年前
如果第三个参数为 true,则图像将以某种方式调整大小,使其包含在所述尺寸内。
这就像更改图像尺寸以使其包含在给定尺寸的框内。

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

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

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

// 创建新的 Imagick 对象
$image = new Imagick('input_image_filename_and_location');

// 调整大小以适应宽度或高度较大者
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('output_image_filename_and_location');
// 销毁 Imagick 对象,在此过程中释放分配的资源
$image->destroy();

?>

我发现 setCompression 完全不起作用,必须使用 setImageCompression。 stripImage 调用是必要的,并且会去除不需要的元数据。 您可以选择任何您想要的过滤器,但我发现 lanczos 对于图像缩减来说是最好的,尽管它在计算上更繁重。
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');
?>
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);
?>
-2
n-sw-bit at ya dot ru
16 年前
如果您想将图片调整大小以适合最小的参数

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

if($fitbyWidth){
$im->thumbnailImage($maxWidth, 0, false);
}else{
$im->thumbnailImage(0, $maxHeight, false);
}
-1
raybdbomb . gmail
16 年前
如这里所述
https://php.net/manual/en/ref.imagick.php
当其中一个参数为 0 时,将保持纵横比。
-4
sgarner at expio dot co dot nz
16 年前
当 $fit 为 true 时,图像按比例调整大小,使其最小的尺寸与指定的宽度或高度匹配,而不是两者都匹配。

例如,如果您指定 thumbnailImage(400, 400, true),而图像的原始尺寸为 1600x800,它将被调整为 800x400,而不是您可能预期的 400x200。

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

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