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 年前
某些尺寸、影像和濾鏡以及模糊(blur)值的組合會導致影像產生雜訊,甚至使影像完全扭曲。就我所見,當模糊值小於 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