2012-02-06 520 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; 
    }