PHP缩略图图像按比例调整大小
image-processing
php
6
0

作为简要介绍,我目前正在建立一个约会类型的网站。用户可以创建帐户并上传个人资料图片(最多8张)。为了在网站的浏览区域中显示这些图像,我正在寻找一种使用PHP(带有第三方处理器/脚本)的方式来调整所有上载图像的大小,使其缩略图符合特定尺寸。

例如,我希望“个人资料”图像(缩略图)不大于120 * 150px。脚本需要调整上载图像的大小(无论它们是纵向还是横向,以及不考虑比例),以符合这些尺寸而不会被拉伸。

宽度(例如120像素)应始终保持不变,但高度(例如150像素)可以变化,以保持图像成比例。如果是风景照,我假设脚本需要从图像中间取出一块?

调整所有图像大小的原因是,当配置文件显示在网格中时,所有缩略图的大小都大致相同。

任何投入将不胜感激。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

根据您的PHP配置,需要GD或Imagick函数。
抱歉,我是新手,我无法在同一封邮件中发布两个链接:(

收藏
评论
$maxwidth = 120;
$maxheight = 150;

$img = imagecreatefromjpeg($jpgimage); 
//or imagecreatefrompng,imagecreatefromgif,etc. depending on user's uploaded file extension

$width = imagesx($img); //get width and height of original image
$height = imagesy($img);

//determine which side is the longest to use in calculating length of the shorter side, since the longest will be the max size for whichever side is longest.    
if ($height > $width) 
{   
$ratio = $maxheight / $height;  
$newheight = $maxheight;
$newwidth = $width * $ratio; 
}
else 
{
$ratio = $maxwidth / $width;   
$newwidth = $maxwidth;  
$newheight = $height * $ratio;   
}

//create new image resource to hold the resized image
$newimg = imagecreatetruecolor($newwidth,$newheight); 

$palsize = ImageColorsTotal($img);  //Get palette size for original image
for ($i = 0; $i < $palsize; $i++) //Assign color palette to new image
{ 
$colors = ImageColorsForIndex($img, $i);   
ImageColorAllocate($newimg, $colors['red'], $colors['green'], $colors['blue']);
} 

//copy original image into new image at new size.
imagecopyresized($newimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

imagejpeg($newimg,$outputfile); //$output file is the path/filename where you wish to save the file.  
//Have to figure that one out yourself using whatever rules you want.  Can use imagegif() or imagepng() or whatever.

这将根据较长的一面(宽度或高度)按比例缩小所有图像到最大尺寸。它还会炸掉小于最大尺寸的所有图像,您可以通过检查宽度和高度是否小于最大尺寸来停止。因此,将200x300的图片缩小为100x150,将300x200的图片缩小为120x80。

嗯,您希望宽度始终为120,所以它会有所变化,是的,如果是200x300之类的图片,则必须剪掉一些东西,因为它会缩小到120x180而没有任何变形,否则必须将其缩得更远并放上信箱,但这应该可以让您入门很好。

在此示例中加标题框将只涉及弄清楚在imagecopyresize()函数中将开始绘制新图像的正确x和y是什么。我认为在100x150之类的情况下,X会是10,所以最后每面120x150的空间将有10px。 Letterboxing 120x80 X将为0,但Y将为35,因此120x150上下的空白将为35px。

您还希望使用$ maxwidth,$ maxheight而不是$ newwidth,$ newheight来制作$ newimg,但是imagecopyresize()仍将同时使用两个$ new值。

由于我很无聊,而且无事可做,所以这些更改可以做到:

if ($height > $width) 
{   
$ratio = $maxheight / $height;  
$newheight = $maxheight;
$newwidth = $width * $ratio; 
$writex = round(($maxwidth - $newwidth) / 2);
$writey = 0;
{
else 
{
$ratio = $maxwidth / $width;   
$newwidth = $maxwidth;  
$newheight = $height * $ratio;   
$writex = 0;
$writey = round(($maxheight - $newheight) / 2);
}

$newimg = imagecreatetruecolor($maxwidth,$maxheight);

//Since you probably will want to set a color for the letter box do this
//Assign a color for the letterbox to the new image, 
//since this is the first call, for imagecolorallocate, it will set the background color
//in this case, black rgb(0,0,0)
imagecolorallocate($newimg,0,0,0);

//Loop Palette assignment stuff here

imagecopyresized($newimg, $img, $writex, $writey, 0, 0, $newwidth, $newheight, $width, $height);

应该可以,还没有尝试过。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号