2012-02-06 329 views
4

我使用整齐的小php脚本来调整图像大小,以适应300x300像素的方块,同时保持纵横比。我从here得到了脚本。使用php调整图像尺寸

这里是整个脚本:

<?php 

/* 
* File: SimpleImage.php 
* Author: Simon Jarvis 
* Copyright: 2006 Simon Jarvis 
* Date: 08/11/06 
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php 
* 
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License 
* as published by the Free Software Foundation; either version 2 
* of the License, or (at your option) any later version. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details: 
* http://www.gnu.org/licenses/gpl.html 
* 
*/ 

class SimpleImage { 

    var $image; 
    var $image_type; 

    function load($filename) { 

     $image_info = getimagesize($filename); 
     $this->image_type = $image_info[2]; 
     if($this->image_type == IMAGETYPE_JPEG) { 

     $this->image = imagecreatefromjpeg($filename); 
     } elseif($this->image_type == IMAGETYPE_GIF) { 

     $this->image = imagecreatefromgif($filename); 
     } elseif($this->image_type == IMAGETYPE_PNG) { 

     $this->image = imagecreatefrompng($filename); 
     } 
    } 
    function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) { 

     if($image_type == IMAGETYPE_JPEG) { 
     imagejpeg($this->image,$filename,$compression); 
     } elseif($image_type == IMAGETYPE_GIF) { 

     imagegif($this->image,$filename); 
     } elseif($image_type == IMAGETYPE_PNG) { 

     imagepng($this->image,$filename); 
     } 
     if($permissions != null) { 

     chmod($filename,$permissions); 
     } 
    } 
    function output($image_type=IMAGETYPE_JPEG) { 

     if($image_type == IMAGETYPE_JPEG) { 
     imagejpeg($this->image); 
     } elseif($image_type == IMAGETYPE_GIF) { 

     imagegif($this->image); 
     } elseif($image_type == IMAGETYPE_PNG) { 

     imagepng($this->image); 
     } 
    } 
    function getWidth() { 

     return imagesx($this->image); 
    } 
    function getHeight() { 

     return imagesy($this->image); 
    } 
    function resizeToHeight($height) { 

     $ratio = $height/$this->getHeight(); 
     $width = $this->getWidth() * $ratio; 
     $this->resize($width,$height); 
    } 

    function resizeToWidth($width) { 
     $ratio = $width/$this->getWidth(); 
     $height = $this->getheight() * $ratio; 
     $this->resize($width,$height); 
    } 

    function scale($scale) { 
     $width = $this->getWidth() * $scale/100; 
     $height = $this->getheight() * $scale/100; 
     $this->resize($width,$height); 
    } 

    function resize($width,$height) { 
     $new_image = imagecreatetruecolor($width, $height); 
     imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); 
     $this->image = $new_image; 
    }  

} 
?> 

,这里是我如何使用它:

$image = new SimpleImage(); 
    $image->load($_FILES['uploaded_image']['tmp_name']); 
    $image->resizeToWidth(300); 
    $image->resizeToHeight(300); 
    $image->save('./images/photo'.$id.'.jpg'); 
    header("Location: people.php"); 
    exit; 

这里是我的问题: 只调整大小的高度。所以,如果我给它一个1200x990(宽x高)的图像,它会吐出一个 400x300(如果有意义的话),这不适合我的300x300方块。

我也试过:

$image = new SimpleImage(); 
    $image2 = new SimpleImage(); 
    $image->load($_FILES['uploaded_image']['tmp_name']); 
    $image->resizeToWidth(300); 
    $image->save('temp.jpg'); 
    $image2->load('temp.jpg'); 
    $image2->resizeToHeight(300); 
    $image2->save('./images/photo'.$id.'.jpg'); 
    unlink('temp.jpg'); 
    header("Location: people.php"); 
    exit; 

对不起,我的代码质量可怕,我想我最好包括万一源在那里我是从移动或关闭的地方。

在那里的任何敬虔的程序员?

回答

3

它正常工作 - 调整到300的高度并保持高宽比(在这种情况下,使宽度为400)。您需要首先查看哪一边是最大边(或者更准确地说,离您所需的纵横比最远的一边),然后只调用一个函数(resizeToWidth()或resizeToHeight())。

如果我不得不使用这个类,我认为这会工作:

$image = new SimpleImage(); 
$size = getImageSize($_FILES['uploaded_image']['tmp_name']); 
if ($size[0] > 300) { 
    $image->load($_FILES['uploaded_image']['tmp_name']); 
    $image->resizeToWidth(300); 
    $image->save('./images/photo'.$id.'.jpg'); 
} else { 
    move_uploaded_file($_FILES['uploaded_image']['tmp_name'], './images/photo'.$id.'.jpg'); 
} 

$size = getImageSize('./images/photo'.$id.'.jpg'); 
if ($size[1] > 300) { 
    $image->load('./images/photo'.$id.'.jpg'); 
    $image->resizeToHeight(300); 
    $image->save('./images/photo'.$id.'.jpg'); 
} 

header("Location: people.php"); 
exit; 
+0

100%严峻,谢谢! – JoeRocc 2012-02-07 00:55:57

+0

非常欢迎。这有点难看 - 你可能想先考虑将文件移动到你的图像目录,这样你可以稍微收拾一下代码。 – 2012-02-07 09:39:11

0

如果它给你的问题,你可以走后门了。不要让班级计算比率,直接进入调整大小功能。

 $image = new SimpleImage(); 
    $image->load($_FILES['uploaded_image']['tmp_name']);  
    $image->resize(300, 300); 
    $image->save('./images/photo'.$id.'.jpg'); 
    header("Location: people.php"); 
    exit; 
+1

虽然这不会保持宽高比。 – 2012-02-06 15:33:29

1

添加fitToSquare功能SimpleImage类中,此函数计算x和源图像的y坐标,然后裁剪为正方形。我没有测试我的功能:)但它似乎确定。

function fitToSquare($width) { 
     $new_image = imagecreatetruecolor($width, $height); 

     $sourceX = 0; 
     $sourceY = 0; 

     if($this->getWidth() > $this->getHeight()) 
     { 
      $sourceX = ($this->getWidth() - $this->getHeight())/2; 
     } 
     else 
     { 
      $sourceY = ($this->getHeight() - $this->getWidth())/2; 
     } 

     imagecopyresampled($new_image, $this->image, 0, 0, $sourceX, $sourceY, $width, $height, $this->getWidth(), $this->getHeight()); 
     $this->image = $new_image; 
    } 
+0

谢谢adenizc!我没有最终使用这个,因为有一些错误(这可能是微不足道的 - 但我不擅长PHP类) – JoeRocc 2012-02-07 00:57:29

+0

我解决了这个问题并将其添加为答案。 – Hawkee 2015-10-30 17:12:14

1
 function imageResize($filename, $dest, $ndest,$filetempname,$filename) { 
     $userfile_name = (isset($filename) ? $filename : ""); 

     $mb_byte_2 = (1024 * 2 * 1000);    
     $ftmp = $filetempname; 

     $oname = $filename; 
     $fname = $dest; 
     $sizes = getimagesize($ftmp); 
     $width = $sizes[0]; 
     $height = $sizes[1]; 

     $extenssion = strstr($oname, "."); 

     $prod_img = $fname; 
     $prod_img_thumb =$ndest; 
     move_uploaded_file($ftmp, $prod_img); 
     $original_filesize = (filesize($prod_img)/1024); 
     $sizes = getimagesize($prod_img); 

     $expected_max_width = 125; 
     $expected_max_height = 100; 
     $originalw = $sizes[0]; 
     $originalh = $sizes[1]; 

     if ($originalh < $expected_max_height) { 
      if ($originalw < $expected_max_width) { 
       $imgwidth = $originalw; 
       $imgheight = $originalh; 
      } else { 
       $imgheight = ($expected_max_width * $originalh)/$originalw; 
       $imgwidth = $expected_max_width; 
      } 
     } else { 
      $new_height = $expected_max_height; 
      $new_width = ($expected_max_height * $originalw)/$originalh; 

      if ($new_width > $expected_max_width) { 
       $new_height = ($expected_max_width * $expected_max_height)/$new_width; 
       $new_width = $expected_max_width; 
      } 

      $imgwidth = $new_width; 
      $imgheight = $new_height; 
     } 
     $new_h = $imgheight; 
     $new_w = $imgwidth; 
     $new_w_im = '125'; 
     $new_h_im = '100'; 
     $offsetwidth = $new_w_im - $new_w; 
     $offsetw = $offsetwidth/2; 
     $offsetheight = $new_h_im - $new_h; 
     $offseth = $offsetheight/2; 
     // echo $extenssion; 
     $dest = imagecreatetruecolor($new_w_im, $new_h_im); 
     $bg = imagecolorallocate($dest, 255, 255, 255); 
     imagefill($dest, 0, 0, $bg); 

     if ($extenssion == '.jpg') { 
      $src = imagecreatefromjpeg($prod_img) 
        or die('Problem In opening Source JPG Image'); 
     } elseif ($extenssion == '.jpeg') { 
      $src = imagecreatefromjpeg($prod_img) 
        or die('Problem In opening Source JPEG Image'); 
     } elseif ($extenssion == '.gif') { 
      $src = imagecreatefromgif($prod_img) 
        or die('Problem In opening Source GIF Image'); 
     } elseif ($extenssion == '.png') { 
      $src = imagecreatefrompng($prod_img) 
        or die('Problem In opening Source PNG Image'); 
     } elseif ($extenssion == '.bmp') { 
      //print_r($prod_img); 
      //    $src = imagecreatefrombmp($prod_img) 
     //    or die('Problem In opening Source BMP Image'); 
     } 

     if (function_exists('imagecopyresampled')) { 
      imagecopyresampled($dest, $src, $offsetw, $offseth, 0, 0, 
      $new_w, $new_h, imagesx($src), imagesy($src)) 
        or die('Problem In resizing'); 
     } else { 
      Imagecopyresized($dest, $src, $offsetw, $offseth, 0, 0, 
      $new_w, $new_h, imagesx($src), imagesy($src)) 
        or die('Problem In resizing'); 
     } 
     imagejpeg($dest, $prod_img_thumb, 72) 
       or die('Problem In saving'); 
     imagedestroy($dest); 
     @ob_flush(); 
     $new_filesize = (filesize($prod_img)/1024); 
    } 
+0

小心添加一些评论给你的答案?它是如何工作的?这是你的算法的流程? – Yaroslav 2012-10-04 10:16:49

2

您可以利用现有的imagescale()从PHP 5.5.0,简化您的调整大小/缩放图像的过程。

这样......

$imgresource = imagecreatefromjpeg("pathtoyourimage.jpg"); 
imagescale($imgresource, 500, 900, IMG_BICUBIC); 
0

你不能这样做resizetowidth然后resizetoheight。
这实际上将其重新调整为363x300。
创建一个新的功能,其保持纵横比:

function scale_kar($maxwidth,$maxheight) { 
    $width = $this->getWidth(); 
    $height = $this->getheight(); 
    if($width > $height) { 
      $ratio = $maxwidth/$width; 
      $height = $height * $ratio; 
      $this->resize($maxwidth,$height); 
    } 
    if($width < $height) { 
      $ratio = $maxheight/$height; 
      $width = $width * $ratio; 
      $this->resize($width,$maxheight); 
    } 
} 

然后调用它:

$image->scale_kar(300,300); 
0

我固定张贴由@adenizc功能创造了拉请求SimpleImage库。这里是功能:

/** 
    * Square crop 
    * 
    * This function crops the image to fit the given size which is both the width and the height 
    * 
    * @param int $size 
    * 
    * @return SimpleImage 
    */ 

    function square($size) { 
     $new = imagecreatetruecolor($size, $size); 

     $sourceX = 0; 
     $sourceY = 0; 

     if($this->width > $this->height) { 
      $this->fit_to_height($size); 
      $sourceX = ($this->width - $size)/2; 
     } 
     else { 
      $this->fit_to_width($size); 
      $sourceY = ($this->height - $size)/2; 
     } 

     imagealphablending($new, false); 
     imagesavealpha($new, true); 
     imagecopy($new, $this->image, 0, 0, $sourceX, $sourceY, $size, $size); 
     $this->image = $new; 

     return $this; 
    }