调整图像大小的最佳方法是什么,可以是任意尺寸,固定尺寸,或至少适合固定尺寸?
图像来自不受我控制的随机网址,我必须确保图像不会超出大约250px x 300px或20%x 50%的区域。
我认为我会首先确定大小,如果它超出范围,请调整大小,但我不确定如果图像大小可能是任何东西,如何计算调整大小的逻辑。
编辑:我没有对图像的本地访问权限,图像网址是一个变量,用img src = ...输出,我需要一种方法来指定宽度和高度标记的值。
答案 0 :(得分:4)
使用ImageMagick很容易。您可以通过exec使用转换命令行工具,也可以使用http://www.francodacosta.com/phmagick/resizing-images 如果您使用'转换',您甚至可以告诉ImageMagick只调整较大的图片大小并且不转换较小的图片:http://www.imagemagick.org/Usage/resize/
如果您没有本地访问权限,则无法使用ImageMagick:
<?php
$maxWidth = 250;
$maxHeight = 500;
$size = getimagesize($url);
if ($size) {
$imageWidth = $size[0];
$imageHeight = $size[1];
$wRatio = $imageWidth / $maxWidth;
$hRatio = $imageHeight / $maxHeight;
$maxRatio = max($wRatio, $hRatio);
if ($maxRatio > 1) {
$outputWidth = $imageWidth / $maxRatio;
$outputHeight = $imageHeight / $maxRatio;
} else {
$outputWidth = $imageWidth;
$outputHeight = $imageHeight;
}
}
?>
答案 1 :(得分:1)
您是否查看了GD库文档,尤其是imagecopyresized方法?
答案 2 :(得分:1)
如果你必须保持图像的纵横比不变,那么你应该将其缩放一个因子,使图像的较长边(高度或宽度)符合该边的限制。
答案 3 :(得分:0)
您可以使用以下内容:
$maxWidth = 250;
$maxHeight = 500;
$validSize = true;
$imageinfo = getimagesize($filename);
if ($imageinfo) {
$validSize &= $imageinfo[0] <= $maxWidth;
$validSize &= $imageinfo[1] <= $maxHeight;
}
&=
是bitwise-and operator &
和assignment operator =
的组合运算符。因此$foo &= *expr*
和$foo = $foo & *expr*
是等效的。
答案 4 :(得分:0)
我不确定你答案的确切解决方案,但我知道用PHP编写的项目有解决方案。去看看为Drupal CMS构建的ImageCache,它是用PHP编写的。
它基本上让你定义一些动作来拍摄任意图像,并产生你想要的任何缩放/裁剪图像。
你必须学习一些Drupal API才能理解这个例子,但它很广泛,如果你理解他们的算法,你就能解决其他更复杂的问题。
答案 5 :(得分:0)
我创建了以下功能来根据比例智能调整图像大小,甚至还有一个参数可以放大较小的图像(如果缩略图尺寸很大,HTML布局会搞定,这一点至关重要。)
function ImageIntelligentResize( $imagePath, $maxWidth, $maxHeight, $alwaysUpscale )
{
// garbage in, garbage out
if ( IsNullOrEmpty($imagePath) || !is_file($imagePath) || IsNullOrEmpty($maxWidth) || IsNullOrEmpty($maxHeight) )
{
return array("width"=>"", "height"=>"");
}
// if our thumbnail size is too big, adjust it via HTML
$size = getimagesize($imagePath);
$origWidth = $size[0];
$origHeight = $size[1];
// Check if the image we're grabbing is larger than the max width or height or if we always want it resized
if ( $alwaysUpscale || $origWidth > $maxWidth || $origHeight > $maxHeight )
{
// it is so let's resize the image intelligently
// check if our image is landscape or portrait
if ( $origWidth > $origHeight )
{
// target image is landscape/wide (ex: 4x3)
$newWidth = $maxWidth;
$ratio = $maxWidth / $origWidth;
$newHeight = floor($origHeight * $ratio);
// make sure the image wasn't heigher than expected
if ($newHeight > $maxHeight)
{
// it is so limit by the height
$newHeight = $maxHeight;
$ratio = $maxHeight / $origHeight;
$newWidth = floor($origWidth * $ratio);
}
}
else
{
// target image is portrait/tall (ex: 3x4)
$newHeight = $maxHeight;
$ratio = $maxHeight / $origHeight;
$newWidth = floor($origWidth * $ratio);
// make sure the image wasn't wider than expected
if ($newWidth > $maxWidth)
{
// it is so limit by the width
$newWidth = $maxWidth;
$ratio = $maxWidth / $origWidth;
$newHeight = floor($origHeight * $ratio);
}
}
}
// it's not, so just use the current height and width
else
{
$newWidth = $origWidth;
$newHeight = $origHeight;
}
return array("width"=>$newWidth, "height"=>$newHeight);
}