Изменение размера изображения PHP - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть скрипт, который загружает файлы на сервер, а также добавляет имя файла в базу данных, но я хотел бы ограничить максимальные размеры изображения перед загрузкой. Поэтому, если я загружу изображение размером 1000 x 500, оно будет ограничено, но при этом сохранит свои размеры и будет изменено на 200 x 100, а изображение 300 x 300 будет ограничено 200 x 200

.
    <?php 

     //This is the directory where images will be saved 
     $target = "uploads/"; 
     $target = $target . basename( $_FILES['photo']['name']); 

     //This gets all the other information from the form 
     $name=$_POST['name']; 
     $pic=($_FILES['photo']['name']); 

     // Connects to your Database 
     mysql_connect("hostname", "username", "password") or die(mysql_error()) ; 
     mysql_select_db("database") or die(mysql_error()) ; 

     //Writes the information to the database 
     mysql_query("INSERT INTO `table` (name, photo) VALUES ('$name','$pic')") ; 

     //Writes the photo to the server 
     if(move_uploaded_file($_FILES['photo']['tmp_name'], $target)) 
     { 

     //Tells you if its all ok 
     echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"; 
     } 
     else { 

     //Gives and error if its not 
     echo "Sorry, there was a problem uploading your file."; 
     } 
     ?> 

Спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Насколько мне известно, вы не можете изменить размер изображения до его загрузки.(Я могу ошибаться!) Однако, когда вы загружаете изображение, оно помещается во временный файл.Вы можете изменить размер временного изображения и скопировать измененное изображение в конечный пункт назначения.

Этот код был адаптирован из фрагмента FliquidStudios: Изменение размера изображений в PHP с помощью GD и Imagick .

Поскольку (кажется) вы хотите поддерживать постоянную ширину, вам не нужно делать много тестов отношения.

Обновление:

Вы должны иметь возможность просто использовать это вместо вашего исходного кода.Большая часть неизменна.

<?php

// resizes an image to fit a given width in pixels.
// works with BMP, PNG, JPEG, and GIF
// $file is overwritten
function fit_image_file_to_width($file, $w, $mime = 'image/jpeg') {
    list($width, $height) = getimagesize($file);
    $newwidth = $w;
    $newheight = $w * $height / $width;

    switch ($mime) {
        case 'image/jpeg':
            $src = imagecreatefromjpeg($file);
            break;
        case 'image/png';
            $src = imagecreatefrompng($file);
            break;
        case 'image/bmp';
            $src = imagecreatefromwbmp($file);
            break;
        case 'image/gif';
            $src = imagecreatefromgif($file);
            break;
    }

    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    switch ($mime) {
        case 'image/jpeg':
            imagejpeg($dst, $file);
            break;
        case 'image/png';
            imagealphablending($dst, false);
            imagesavealpha($dst, true);
            imagepng($dst, $file);
            break;
        case 'image/bmp';
            imagewbmp($dst, $file);
            break;
        case 'image/gif';
            imagegif($dst, $file);
            break;
    }

    imagedestroy($dst);
}

// init file vars
$pic  = $_FILES['photo']['name'];
$target = 'uploads/' . basename( $_FILES['photo']['name']);
$temp_name = $_FILES['photo']['tmp_name'];
$type = $_FILES["photo"]["type"];

// Connects to your Database 
mysql_connect("hostname", "username", "password") or die(mysql_error()) ; 
mysql_select_db("database") or die(mysql_error()) ; 

// get form data
$name = mysql_real_escape_string(isset($_POST['name']) ? $_POST['name'] : 'No name');

//Writes the information to the database 
mysql_query("INSERT INTO `table` (name, photo) VALUES ('$name','$pic')") ; 

// resize the image in the tmp directorys
fit_image_file_to_width($temp_name, 200, $type);

//Writes the photo to the server
if(move_uploaded_file($temp_name, $target)) {

    //Tells you if its all ok 
    echo "The file ". basename( $_FILES['photo']['name'] ). " has been uploaded"; 

} else {

    //Gives and error if its not 
    echo "Sorry, there was a problem uploading your file."; 

}

?>
0 голосов
/ 26 сентября 2011

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

function resize_img_nofill($src_name,$dst_name,$width,$height,$dontExpand=false) {
        $MAGIC_QUOTES = set_magic_quotes_runtime();
        set_magic_quotes_runtime(0);

        $type =  strtolower(substr(strrchr($src_name,"."),1));

        if($type == "jpg") {
            $src = imagecreatefromjpeg($src_name);
        } else if($type == "png") {
            $src = imagecreatefrompng($src_name);    
        } else if($type == "gif") {
            $src = imagecreatefromgif($src_name);    
        } else {
                if($src_name != $dst_name) copy($src_name,$dst_name);
                set_magic_quotes_runtime($MAGIC_QUOTES);
                return;
        }



        $d_width = $s_width = imagesx($src);
        $d_height = $s_height = imagesy($src);

        if($s_width*$height > $width*$s_height && (!$dontExpand || $width < $s_width)) {
            $d_width = $width;
            $d_height = (int)round($s_height*$d_width/$s_width);
        } else if(!$dontExpand || $height < $s_height) {
            $d_height = $height;
            $d_width = (int)round($s_width*$d_height/$s_height);
        }

        if($s_width != $d_width || $s_height != $d_height) {

                if($type == "jpg") {
                        $dst = imagecreatetruecolor($d_width,$d_height);
                } else if($type == "png") {
                $dst = imagecreate($d_width,$d_height);
                } else if($type == "gif") {
                $dst = imagecreate($d_width,$d_height);
                } 

                $white = imagecolorallocate($dst,255,255,255);
                imagefilledrectangle($dst,0,0,$d_width,$d_height,$white);
                imagecopyresampled($dst,$src,0,0,0,0,$d_width,$d_height,$s_width,$s_height);

                if($type == "jpg") 
                imagejpeg($dst,$dst_name, 80);  
                else if($type == "png")
                imagepng($dst,$dst_name);       
                else if($type == "gif")
                imagegif($dst,$dst_name);       

                imagedestroy($dst);
                imagedestroy($src);
        } else {
                copy($src_name,$dst_name);
        }


        set_magic_quotes_runtime($MAGIC_QUOTES);
        return array($d_width,$d_height);
}
...