Делает неправильные миниатюры

Статус
В этой теме нельзя размещать новые ответы.

irkmos

Создатель
Регистрация
7 Май 2007
Сообщения
48
Реакции
4
Вот достаточно неплохой скрипт для загрузки фоток с созданием миниатюр по заданным размером. Но вот миниатюра как то неправильно вырезается, получается не уменьшенная фотка - а вырванный кусок заданного размера из большой фотографии. Поправьте плиз, чтобы превьюшка получалась нормальной. Спасибо.
PHP:
<?
    // поехали :)
if (!empty($_FILES['imgs'])) {
    // назначим наши переменные
    $imgs = $_FILES['imgs'];
    $imgs_size = $_FILES['imgs']['size'];
    $imgs_type = $_FILES['imgs']['type'];
    $imgs_name = $_FILES['imgs']['name'];
    $imgs_tmp_name = $_FILES['imgs']['tmp_name'];
    // задаем максимальный вес картинки, если превышен, то выводим ошибку
        if ($imgs_size > 5*1024*1000) die ('<center>Размер картинки превысил лимит в 5 МБ. <a href="'.$PHP_SELF.'">Загрузить заного</a></center>');
    // получаем расширения файлов для загрузки
        preg_match("'([a-z]+)\/[x\-]*([a-z]+)'", $imgs_type, $ext);
        switch($ext[2]) {
            case "jpg":
            case "jpeg":
            case "pjpeg":
            break;
            default: die("<center>Ошибка!<br />\n Допускаются файлы: <b>.jpg, .jpeg, .pjpeg</b> до 5МБ<br /> <a href='{$PHP_SELF}'>Загрузить заного</a></center>");
        }
    // задаем допустимые размеры картинок для загрузки
        $width_max = 640;
        $height_max = 480;
    // получаем размеры
            $img_size = getimagesize($imgs_tmp_name);
            $width_original = $img_size[0];
            $height_original = $img_size[1];
    // еще одна проверка на размер загружаемых картинок, если превышен, то ошибка
            if ($width_original < $width_max || $height_original < $height_max) die ("<center>Запрещено загружать картинки с размерами меньше {$width_max}x{$height_max}. <a href='{$PHP_SELF}'>Загрузить заного</a></center>");
    // создадим пустое изображение с нужными нам размерами
            $image_p = imagecreatetruecolor($width_max, $height_max);
    // собственно создали :)
            $image = imagecreatefromjpeg($imgs_tmp_name);
    // определим пропорции для дальнейшей обрезки до них
            $w_prp = ($width_original / $width_max);
            $h_prp = ($height_original / $height_max);
    // определим высоту и ширину будущих сжатых картинок
            $p_w = ($width_max / $width_original);
            $h_new = ($height_original * $p_w);
            $y1 = (($h_new - $height_max) / 2);
 
            $p_h = ($height_max / $height_original);
            $w_new = ($width_original * $p_h);
            $x1 = (($w_new - $width_max) / 2);
 
    // описываем когда приходиться сжимать ширину, а высоту резать
            if ($w_prp < $h_prp) {
            $image_p_1 = imagecreatetruecolor($width_max, $h_new);
    // выполним копирование и ресамдлинг нашей картинки, т.е. с помощью GD библиотеки сгладим и заполним промежуточными цветами недостающие точки
            imagecopyresampled($image_p_1, $image, 0, 0, 0, 0, $width_max, $h_new, $width_original, $height_original);
            imagecopyresampled($image_p, $image_p_1, 0, 0, 0, $y1, $width_max, $height_max, $width_max, $height_max);
            }
    // описываем когда приходиться сжимать высоту, а ширину резать
            elseif ($w_prp > $h_prp) {
            $image_p_1 = imagecreatetruecolor($w_new, $height_max);
    // сного выполним копирование и ресамдлинг нашей картинки, т.е. с помощью GD библиотеки сгладим и заполним промежуточными цветами недостающие точки
            imagecopyresampled($image_p_1, $image, 0, 0, 0, 0, $w_new, $height_max, $width_original, $height_original);
            imagecopyresampled($image_p, $image_p_1, 0, 0, $x1, 0, $width_max, $height_max, $width_max, $height_max);
            }
    // если все размеры соблюдены, то сжимаем
            elseif ($w_h_prp == $curr_prp) {
            imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width_max, $height_max, $width_original, $height_original);
            }
    // определяем время для названия картинки, удобно если заносим в базу сортировать по времени добавления
            $time = time();
    // определяем пути до картинок и их миниатюр и названия для них
            $imgs_path = "images/full/{$time}.jpg";
            $thumb_path = "images/thumbs/{$time}.jpg";
            if (imagejpeg($image_p, $imgs_path, 100)) {
    // если все замечательно, создаем файл миниатюры, метод немного отличается для разнообразия от того, что описан выше, если захотите можете потренироваться и сделать создание миниатюр так же как и выше
            $thumb_width = 150;
            $thumb_height = 113;
            $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
            $w_point = (($width_original - $thumb_width) / 2);
            $h_point = (($height_original - $thumb_height) / 2);
            imagecopyresampled($thumb, $image, 0, 0, $w_point, $h_point, $thumb_width, $thumb_height, $thumb_width, $thumb_height);
            imagejpeg($thumb, $thumb_path, 100);
    // описываем вывод, опять же, если захотите можете выводить запрос в базу данных или куда еще будет угодно
            $vvd = "тут можно отправить запрос в базу";
            if ($vvd) {
                echo "<div align='center'><img src='$imgs_path' alt='image' /><br /><h4>Изображение успешно загружено</h4><img src='$thumb_path' alt='image' /><br /><h4>Его миниатюра удачно создана.</h4><br /><h2>Поздравляем!!!</h2><br />\n<a href='{$PHP_SELF}'>Загрузить ещё</a></div>";
            }
    // очередная проверка, если картинка ни куда не добавлена, то ошибка
            else {
                echo "Ошибка. Картинка не добавлена!";
                unlink($imgs_path);
                unlink($thumb_path);
                }
            }
    // вывод ошибки при копировании
        else print ("Ошибка!");
    }
    else {
    // ну и наконец то наша форма для загрузки картинок
echo "<html>\n";
echo "<head>\n";
echo "<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>\n";
echo "<title>Загрузка изображений</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<div align='center'><h1>Загрузка изображений:</h1>\n";
echo "<form action='{$PHP_SELF}' method='post' enctype='multipart/form-data'>\n";
echo "<h3>Выбрать файл для загрузки:</h3><input name='imgs' type='file' size='50' /><br /><br />\n";
echo "<input type='submit' value='Загрузить' /> <input type='reset' value='Отменить'><br />Разрешено загружать только: <b>.jpg, .jpeg, .pjpeg</b> файлы весом до 5МБ.<br />\n";
echo "</form>\n";
echo "</div>\n";
echo "</body>\n";
echo "</html>";
    }
    // и в конце то концов, это метод загрузки картинок расширений джипег, для остальных разрешений, если захотите можете написать свои функции, используя например такие функции как imagecreatefromgif, imagecreatefrompng и т.д.
?>
 
Посмотри phpThumb и Wideimage
Для валидации:
$image = is(array('jpg', 'png', 'gif'), 'path/to/file');

PHP:
function is($extensions, $path)
{
$mimes = array('mimes.........');
 
$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path);
 
foreach ((array) $extensions as $extension)
{
if (isset($mimes[$extension]) and in_array($mime, (array) $mimes[$extension]))
{
return true;
}
}
 
return false;
}
 
Я в этом ничего не понимаю поэтому попросил поправить для корректной работы скрипта, это именно то что мне нужно.
 
да миниатюра там не изменяется, надо делать как выше картинка пропорционально изменяется так и с миниатюрой, а вообще действия одни и те же с картинкой или с миниатюрой только размер разный, поэтому можно вынести процесс создания отдельно функцией. Да и соединение с базой лучше проверять перед созданием картинки. И вычисление нового пропорционального размера можно попроще сделать. И html не изменяется, то лучше вынести его из php кода. После такого рефакторинга получилось так:
PHP:
<?
//функция изменения размера картинки
function resize_image($imgs_tmp_name, $thumb_path, $thumb_width, $thumb_height, $width_original, $height_original){
    $image = imagecreatefromjpeg($imgs_tmp_name);
    $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
    //пропорционально вычислить новые размеры картинки по заданным реальным размерам
    $width_original_new = $height_original * $thumb_width / $thumb_height;
    $height_original_new = $width_original * $thumb_height / $thumb_width;
    //если новая ширина больше реальной ширины картинки значит высота будет слишком большая и остаток отрезаем или наоборот
    if($width_original_new>$width_original){
        //точка отрезания по высоте
        $h_point = (($height_original - $height_original_new) / 2);
        //копирование картинки
        imagecopyresampled($thumb, $image, 0, 0, 0, $h_point, $thumb_width, $thumb_height, $width_original, $height_original_new);
    }else{
        //точка отрезания по ширине
        $w_point = (($width_original - $width_original_new) / 2);
        imagecopyresampled($thumb, $image, 0, 0, $w_point, 0, $thumb_width, $thumb_height, $width_original_new, $height_original);
    }
    imagejpeg($thumb, $thumb_path, 100);
}
 
// поехали :) 
if (!empty($_FILES['imgs'])) {
    // назначим наши переменные
    $imgs = $_FILES['imgs'];
    $imgs_size = $_FILES['imgs']['size'];
    $imgs_type = $_FILES['imgs']['type'];
    $imgs_name = $_FILES['imgs']['name'];
    $imgs_tmp_name = $_FILES['imgs']['tmp_name'];
        // задаем максимальный вес картинки, если превышен, то выводим ошибку
        if ($imgs_size > 5*1024*1000) die ('<center>Размер картинки превысил лимит в 5 МБ. <a href="'.$PHP_SELF.'">Загрузить заново</a></center>');
        // получаем расширения файлов для загрузки
        preg_match("'([a-z]+)\/[x\-]*([a-z]+)'", $imgs_type, $ext);
        switch($ext[2]) {
            case "jpg":
            case "jpeg":
            case "pjpeg":
            break;
            default: die("<center>Ошибка!<br />\n Допускаются файлы: <b>.jpg, .jpeg, .pjpeg</b> до 5МБ<br /> <a href='{$PHP_SELF}'>Загрузить заного</a></center>");
        }
 
        // задаем допустимые размеры картинок для загрузки
        $width_max = 640;
        $height_max = 480;
        // получаем размеры
        $img_size = getimagesize($imgs_tmp_name);
        $width_original = $img_size[0];
        $height_original = $img_size[1];
        //еще одна проверка на размер загружаемых картинок, если превышен, то ошибка
        if ($width_original < $width_max || $height_original < $height_max) die ("<center>Запрещено загружать картинки с размерами меньше {$width_max}x{$height_max}. <a href='{$PHP_SELF}'>Загрузить заного</a></center>");
     
     
        $vvd = "тут можно отправить запрос в базу";
        //если нет соединения с базой то и загружать не надо
        if($vvd){
            //лучше заменить на уникальное например id из базы
            $time = time();
            //определяем пути до картинок и их миниатюр и названия для них
            $imgs_path = "images/full/{$time}.jpg";
            $thumb_path = "images/thumbs/{$time}.jpg";
            //создание картинки
            resize_image($imgs_tmp_name, $imgs_path, $width_max, $height_max, $width_original, $height_original);
            //создание миниатюры
            resize_image($imgs_tmp_name, $thumb_path, 150, 113, $width_original, $height_original);
 
            echo "<div align='center'><img src='$imgs_path' alt='image' /><br /><h4>Изображение успешно загружено</h4><img src='$thumb_path' alt='image' /><br /><h4>Его миниатюра удачно создана.</h4><br /><h2>Поздравляем!!!</h2><br />\n<a href='{$PHP_SELF}'>Загрузить ещё</a></div>";
        }else{
            echo "Ошибка нет соединения с базой.";
        }
 
    }else{
        // ну и наконец то наша форма для загрузки картинок
        ?>
        <html>
        <head>
        <meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>
        <title>Загрузка изображений</title>
        </head>
        <body>
        <div align='center'><h1>Загрузка изображений:</h1>
        <form action='' method='post' enctype='multipart/form-data'>
        <h3>Выбрать файл для загрузки:</h3><input name='imgs' type='file' size='50' /><br /><br />
        <input type='submit' value='Загрузить' /> <input type='reset' value='Отменить'><br />Разрешено загружать только: <b>.jpg, .jpeg, .pjpeg</b> файлы весом до 5МБ.<br />
        </form>
        </div>
        </body>
        </html>
        <?
}
 
Спасибо. Все работает как надо. Пригодиться думаю многим.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху