我需要将图片大小调整为固定大小。但它必须保持宽度和高度之间的因素。
我想要将图片从238 (w) X 182 (h)
调整为210 / 150
我现在所做的是:
Original width / target width = 1.333333
Original Height / target Height = 1.213333
现在我采取最小的因素。
现在我总是有238 / 1.333333 = 210
以来的正确宽度。
但身高仍为160
。
如何在不破坏图片的情况下将高度降低到160
?
我需要裁剪吗?如果是这样的话?
答案 0 :(得分:25)
此解决方案与CanBerkGüder的解决方案基本相同,但在花了一些时间撰写和评论之后,我觉得要张贴。
此功能可创建一个与您提供的缩放尺寸完全相同的缩略图。 调整图像大小以最适合缩略图的大小。如果它不完全适合两个方向,它会在thumnail中居中。广泛的评论解释了这些事情。
function thumbnail_box($img, $box_w, $box_h) {
//create the image, of the required size
$new = imagecreatetruecolor($box_w, $box_h);
if($new === false) {
//creation failed -- probably not enough memory
return null;
}
//Fill the image with a light grey color
//(this will be visible in the padding around the image,
//if the aspect ratios of the image and the thumbnail do not match)
//Replace this with any color you want, or comment it out for black.
//I used grey for testing =)
$fill = imagecolorallocate($new, 200, 200, 205);
imagefill($new, 0, 0, $fill);
//compute resize ratio
$hratio = $box_h / imagesy($img);
$wratio = $box_w / imagesx($img);
$ratio = min($hratio, $wratio);
//if the source is smaller than the thumbnail size,
//don't resize -- add a margin instead
//(that is, dont magnify images)
if($ratio > 1.0)
$ratio = 1.0;
//compute sizes
$sy = floor(imagesy($img) * $ratio);
$sx = floor(imagesx($img) * $ratio);
//compute margins
//Using these margins centers the image in the thumbnail.
//If you always want the image to the top left,
//set both of these to 0
$m_y = floor(($box_h - $sy) / 2);
$m_x = floor(($box_w - $sx) / 2);
//Copy the image data, and resample
//
//If you want a fast and ugly thumbnail,
//replace imagecopyresampled with imagecopyresized
if(!imagecopyresampled($new, $img,
$m_x, $m_y, //dest x, y (margins)
0, 0, //src x, y (0,0 means top left)
$sx, $sy,//dest w, h (resample to this size (computed above)
imagesx($img), imagesy($img)) //src w, h (the full size of the original)
) {
//copy failed
imagedestroy($new);
return null;
}
//copy successful
return $new;
}
使用示例:
$i = imagecreatefromjpeg("img.jpg");
$thumb = thumbnail_box($i, 210, 150);
imagedestroy($i);
if(is_null($thumb)) {
/* image creation or copying failed */
header('HTTP/1.1 500 Internal Server Error');
exit();
}
header('Content-Type: image/jpeg');
imagejpeg($thumb);
答案 1 :(得分:10)
这不会裁剪图片,但如果有必要,会在新图片周围留出空间,我认为这是创建缩略图时更好的方法(而不是裁剪)。
$w = 210;
$h = 150;
$orig_w = imagesx($original);
$orig_h = imagesy($original);
$w_ratio = $orig_w / $w;
$h_ratio = $orig_h / $h;
$ratio = $w_ratio > $h_ratio ? $w_ratio : $h_ratio;
$dst_w = $orig_w / $ratio;
$dst_h = $orig_h / $ratio;
$dst_x = ($w - $dst_w) / 2;
$dst_y = ($h - $dst_h) / 2;
$thumbnail = imagecreatetruecolor($w, $h);
imagecopyresampled($thumbnail, $original, $dst_x, $dst_y,
0, 0, $dst_w, $dst_h, $orig_w, $orig_h);
答案 2 :(得分:2)
你有Imagick吗?如果是这样,您可以使用它加载图像并执行thumbnailimage()
在那里你可以跳过任何一个参数(高度或宽度),它会正确调整大小。
答案 3 :(得分:2)
也许看一下PHPThumb(适用于GD和ImageMagick)
答案 4 :(得分:2)
从大图片中获取高质量快速缩略图的提示:(from the php.net site)
如果您在两个阶段生成缩略图:
答案 5 :(得分:1)
我更愿意调整大小以使图像包含在您的限制内,然后填写空白部分。因此,在上面的示例中,您将调整大小以使高度正常,然后用背景颜色向左和向右填充(我认为每端有7个像素)。
答案 6 :(得分:1)
从PHP源代码的网页中调整图像大小可能会有问题。较大的图像(在磁盘上接近2 + MB)可能非常大,以至于需要超过32MB的内存才能处理。
出于这个原因,我倾向于从基于CLI的脚本,可用的内存高达128MB,或标准命令行,也可以根据需要使用它。
# where to put the original file/image. It gets resized back
# it was originally found (current directory)
SAFE=/home/website/PHOTOS/originals
# no more than 640x640 when finished, and always proportional
MAXSIZE=640
# the larger image is in /home/website/PHOTOS/, moved to .../originals
# and the resized image back to the parent dir.
cd $SAFE/.. && mv "$1" "$SAFE/$1" && \
convert "$SAFE/$1" -resize $MAXSIZE\x$MAXSIZE\> "$1"
'convert'是ImageMagick命令行工具的一部分。
答案 7 :(得分:1)
是这些缩略图吗?如果是的话,裁剪不是一个大问题。我们一直这样做。我甚至不回避将任意比例裁剪成残缺的二次缩略图,完全弄乱图像(是的,我是那个硬核),如果看起来不错的话。这是设计师对技术问题的回答,但仍然如此。不要害怕庄稼!
答案 8 :(得分:1)
我认为有点混乱.. 如果您只想调整大小,保持原始比例,则正确的操作是:
$ratio = $originalWidth / $originalHeight;
if(//you start from the width, and want to find the height){
$newWidth = $x;
$newHeight = $x / $ratio;
}else if(//you start from the height, and want to find the width){
$newHeight = $x;
$newWidth = $x * $ratio;
}
否则,如果前缀newWidth和newHeight无法更改,并且拇指比例与原始比率不同,则唯一的方法是裁剪或为拇指添加边框。
如果你采取削减方式,这个功能可以帮助你(我在几年前写了5分钟,也许需要一些改进..它只适用于jpg,例如;):
function thumb_cut($nomeimage, $source_path, $destination_path, $new_width, $new_height){
list($width, $height, $type, $attr) = getimagesize($source_path.$nomeimage);
if($type == 2){
if($width > $new_width){
$new_width = $width;
$new_height = $height;
}
$compression = 100;
$destimg = imagecreatetruecolor($new_width,$new_height) or die("Problems creating the image");
$srcimg = ImageCreateFromJPEG($source_path.$nomeimage) or die("problem opening the image");
$w = ImageSX($srcimg);
$h = ImageSY($srcimg);
$ro = $new_width/$new_height;
$ri = $w/$h;
if($ro<$ri){
$par = "h";
}else{
$par = "w";
}
if($par == "h"){
$ih = $h;
$conv = $new_width/$new_height;
$iw = $conv*$ih;
$cw = ($w/2)-($iw/2);
$ch = ($h/2)-($ih/2);
}else if($par == "w"){
$iw = $w;
$conv = $new_height/$new_width;
$ih = $conv*$iw;
$cw = ($w/2)-($iw/2);
$ch = ($h/2)-($ih/2);
}
ImageCopyResampled($destimg,$srcimg,0,0,$cw,$ch,$new_width,$new_height,$iw,$ih) or die("problems with resize");
ImageJPEG($destimg,$destination_path.$nomeimage,$compression) or die("problems with storing new image");
}
}
答案 9 :(得分:1)
技术是:
最后,如果您对如何进行调整大小数学感到困惑,请记住,如果源图像和目标图像的比例相同,则此关系成立:
SourceWidth / SourceHeight = DestinationWidth / DestinationHeight
如果您知道三个参数,则可以轻松计算出第四个参数。
我写了一篇关于此的文章:
Crop-To-Fit an Image Using ASP/PHP
答案 10 :(得分:0)
您必须从顶部和底部裁剪5像素才能达到目标尺寸,但这可能会破坏图片。
你真的应该有一个目标宽度或高度,然后用相同的比例调整另一个尺寸。