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

將影像大小變更為給定的尺寸並移除任何相關的設定檔。目標是產生適合在網頁上顯示的小型、低成本縮圖影像。如果將 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 則註解

10
Anonymous
12 年前
如果第三個參數為 true,則將調整影像大小,使其包含在提到的尺寸內。
這就像變更影像的尺寸,使其可以包含在給定尺寸的方塊中。

例如:影像的尺寸為 1600*800。如果我們使用 thumbnailImage(400, 400, true),則新影像的尺寸將為 400*200。

此頁面上先前的某些註解提到,影像會按比例調整大小,使其 _最小_ 尺寸符合指定的寬度或高度,而不是兩者都符合。
但現在情況並非如此。影像的寬度和高度都將 <= thumbnailImage() 中提到的值。
或許 imagick 已變更/更新了功能。
14
jarrod at jarrodchristman dot com
13 年前
即使 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
Anonymous
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
17 年前
如此處所述
https://php.dev.org.tw/manual/en/ref.imagick.php
當任一參數為 0 時,會保持長寬比。
-4
sgarner at expio dot co dot nz
17 年前
當 $fit == true 時,圖片會按比例調整大小,使其_最小_的尺寸與指定的寬度或高度相符,而不是兩者都符合。

例如,如果您說 thumbnailImage(400, 400, true),對於 1600x800 的圖片,它將調整大小為 800x400,而不是您可能預期的 400x200。

解決方案是將原始圖片的尺寸與指定的尺寸進行比較,並將較小的尺寸替換為零,並設定 $fit = false。

即:thumbnailImage(400, 0, false) 會將 1600x800 的圖片調整大小為 400x200。
To Top