2012-02-06 4 views
4

Я использую аккуратный небольшой скрипт php для изменения размеров моих изображений, чтобы они соответствовали квадрату размером 300 × 300 пикселей, сохраняя соотношение сторон. Я получил скрипт от 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% Grim, спасибо! – JoeRocc

+0

Добро пожаловать. Это немного уродливо - вы можете подумать о том, чтобы перенести файл в каталог изображений, чтобы вы могли немного привести в порядок код. –

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

Это не будет поддерживать соотношение сторон. –

1

Добавить функцию fitToSquare к классу SimpleImage, эта функция вычисления координаты х и у исходного изображения, кадрирование, как квадрат. Я не тестировал свою функцию :) Но это нормально.

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

+0

Я исправил это и добавил его в качестве ответа. – Hawkee

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

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; 
    } 
Смежные вопросы