Как автоматически изменить размер загруженного изображения с помощью php

У меня есть сценарий;

        $fileName = $_FILES['userfile']['name'];
        $tmpName = $_FILES['userfile']['tmp_name'];
        $fileSize = $_FILES['userfile']['size'];
        $fileType = $_FILES['userfile']['type'];

        // get the file extension first
        $ext = substr(strrchr($fileName, "."), 1); 

        // make the random file name
        $randName = md5(rand() * time());

        // and now we have the unique file name for the upload file
        $filePath = $imagesDir . $randName . '.' . $ext;

        $result = move_uploaded_file($tmpName, $filePath);
        if (!$result) {
            echo "Error uploading file";
        exit;
    } 

if(!get_magic_quotes_gpc()) {

        $fileName = addslashes($fileName);
        $filePath = addslashes($filePath);

    }

который я использую для загрузки изображений, но я хотел бы добавить скрипт для изменения размера изображения до определенного размера перед его загрузкой. Как это сделать???


person Jay Smoke    schedule 12.04.2012    source источник
comment
Это легко сделает это за вас.... phpthumb.sourceforge.net   -  person Baba    schedule 13.04.2012
comment
Я бы убедился, что имя файла уникально, хотя шанс смехотворно мал, но не невозможен   -  person gosukiwi    schedule 13.04.2012
comment
@Баба спасибо за это, но это слишком сложно! смешной! Нет ли более простого способа???   -  person Jay Smoke    schedule 13.04.2012
comment
@gosukiwi, ты имеешь в виду мой сценарий или сценарий Бабы?   -  person Jay Smoke    schedule 13.04.2012
comment
ваш, md5 может направить несколько строк на один и тот же хэш, я знаю, что вероятность смехотворно мала, но я не знаю, учитывая эти мелочи, это то, что делает программу более надежной.   -  person gosukiwi    schedule 13.04.2012


Ответы (2)


РЕДАКТИРОВАТЬ: я обновил это, чтобы включить элементы вашего скрипта. Я начинаю с того места, где вы получаете свое имя файла.

Вот очень быстрый и простой скрипт для этого:

$result = move_uploaded_file($tmpName, $filePath);
$orig_image = imagecreatefromjpeg($filePath);
$image_info = getimagesize($filePath); 
$width_orig  = $image_info[0]; // current width as found in image file
$height_orig = $image_info[1]; // current height as found in image file
$width = 1024; // new image width
$height = 768; // new image height
$destination_image = imagecreatetruecolor($width, $height);
imagecopyresampled($destination_image, $orig_image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
// This will just copy the new image over the original at the same filePath.
imagejpeg($destination_image, $filePath, 100);
person davidethell    schedule 13.04.2012
comment
выглядит хорошо @davidethell, но как мне объединить это с моим скриптом выше??? Было бы здорово, если бы это удалось! - person Jay Smoke; 13.04.2012
comment
@JaySmoke, я обновил этот пример, включив в него переменную $filePath. - person davidethell; 13.04.2012
comment
отлично, но есть ошибка со сценарием. откуда $img_source получает данные??? - person Jay Smoke; 13.04.2012
comment
при загрузке получаю ошибку getimagesize(): имя файла не может быть пустым - person Jay Smoke; 13.04.2012
comment
Спасибо, исправил пример. Я пропустил это. - person davidethell; 13.04.2012
comment
примечание: вы, вероятно, хотите, чтобы imagedestroy($destination_image); после последней строки освобождало память. - person Raptor; 23.07.2013
comment
@ShivanRaptor, это хороший момент, но он необходим только в том случае, если после манипуляции с изображением у вас есть больше выполнения скрипта. PHP в любом случае уничтожает изображение, когда скрипт останавливается, поэтому imagedestroy важен при обработке более чем одного изображения или с большим скриптом, который имеет больше логики после манипуляции с изображением. - person davidethell; 23.07.2013
comment
соглашаться. но сервер должен обслуживать несколько пользователей одновременно. оставлять больше памяти как можно скорее другим всегда лучше - person Raptor; 23.07.2013

Ну, вы не можете изменить его размер до того, как он будет загружен, но вы можете использовать библиотеку GD, чтобы изменить его размер после того, как он будет на сервере. Ознакомьтесь с списком GD и функций изображения , чтобы узнать обо всех связанных функциях для работы с с изображениями.

Существует также это руководство, которое покажет вам пользовательский класс для изменения размера, но если вам не нужно все, вы можете сосредоточиться на изменении размера функции, чтобы увидеть, как это делается

person J_D    schedule 12.04.2012