2012-06-26 3 views
2

Можно создать дубликат:
Resize a picture to a fixed sizephp - изменить размер и сохранить изображение?

Я использую следующий код PHP, чтобы изменить размер (ширину) и сохранить изображение, код не работает без ошибки, но изображение не становится изменен.

<?php 
$old_path = "users_images/".$name.".".$type; 
    $new_path = "main_images/".$name.".".$type; 
    $image_size = getimagesize($new_path); 
    if($image_size['0'] > 700){ 
     $image_size['0'] = 700; 
     } 
     rename($old_path, $new_path);// save image 

?> 

в основном, если ширина изображения больше 700, я хочу установить его на 700? что я делаю неправильно?

+2

Ваш код не делает никакого изменения размера .. вы все это перезаписать вычисленное значение, которое getimagesize возвращает – Ben

+1

Вы только что изменили значение ширины в памяти, никогда не делал ничего изображения (за исключением его переименования). – sachleen

+1

Хотя базовая ошибка, это не заслуживает нисходящего потока – Ben

ответ

0

Вы должны скопировать/переместить изображение с помощью функции imagecopyresampled, которая является частью расширения GD.

9

Переменная $image_size['0'] не является ссылкой на фактический размер изображения.

Вам нужно будет рассчитать отношение размеров, а затем изменить его с помощью соответствующей функции, которая изменяет размеры изображений, возможно, в GD library.

Во-первых, вам нужно будет загрузить изображение. Я дам вам выбрать то, что тип:

$image = imagecreatefromjpeg($new_path); 
$image = imagecreatefromgif($new_path); 
$image = imagecreatefrompng($new_path); 

Теперь рассчитать соотношение:

$ratio = 700/imagesx($image); // 700 for the width you want... 
           // imagesx() to determine the current width 

Получить масштабируется высота:

$height = imagesy($image) * $ratio; // imagesy() to determine the current height 

Выполните фактическое изменение размера:

$new_image = imagecreatetruecolor($width, $height); 
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image)); 
$image = $new_image; // $image has now been replaced with the resized one. 

Я нашел simple class for resizing images. Чтобы защитить от гниения, я воссоздал его здесь:

<?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; 
    }  

} 
?> 
+0

Чтобы сохранить изображение в пределах 700x500: $ ratio = max (700/imagesx ($ image), 500/imagesy ($ image)); –

2

Вы устанавливаете переменное, не изменяя размер изображения. Я откопал какую-то старую функцию, вам нужно передать объект изображения, сохранить путь, имя изображения, максимальную высоту, максимальную ширину и качество. Это не самая лучшая функция, но это результат.

function resizeImage($imgObject, $savePath, $imgName, $imgMaxWidth, $imgMaxHeight, $imgQuality) 
{ 
    $source = imagecreatefromjpeg($imgObject['tmp_name']); 
    list($imgWidth, $imgHeight) = getimagesize($imgObject['tmp_name']); 
    $imgAspectRatio = $imgWidth/$imgHeight; 
    if ($imgMaxWidth/$imgMaxHeight > $imgAspectRatio) 
    { 
     $imgMaxWidth = $imgMaxHeight * $imgAspectRatio; 
    } 
    else 
    { 
     $imgMaxHeight = $imgMaxWidth/$imgAspectRatio; 
    } 
    $image_p = imagecreatetruecolor($imgMaxWidth, $imgMaxHeight); 
    $image = imagecreatefromjpeg($imgObject['tmp_name']); 
    imagecopyresampled($image_p, $source, 0, 0, 0, 0, $imgMaxWidth, $imgMaxHeight, $imgWidth, $imgHeight); 
    imagejpeg($image_p, $savePath . $imgName, $imgQuality); 
    unset($imgObject); 
    unset($source); 
    unset($image_p); 
    unset($image); 
} 
+0

Какой смысл создавать '$ image', поскольку он не используется в остальной части кода? После этого вы используете только '$ image_p' и' $ source'. –

+1

Нет смысла, вы также не должны отменять ничего ИМО. Это было назад, поэтому я не помню, почему я это сделал :) – sed

+0

Если вы уже загрузили файл на сервер, вы должны изменить все коды $ imgObject ['tmp_name'] на $ imgObject. Thats работать для меня спасибо много, и сохранить мою ночь;) – matasoy