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

Тема в разделе "PHP", создана пользователем irkmos, 9 апр 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. irkmos

    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$image0000$width_max$h_new$width_original$height_original);
                
    imagecopyresampled($image_p$image_p_1000$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$image0000$w_new$height_max$width_original$height_original);
                
    imagecopyresampled($image_p$image_p_100$x10$width_max$height_max$width_max$height_max);
                }
        
    // если все размеры соблюдены, то сжимаем
                
    elseif ($w_h_prp == $curr_prp) {
                
    imagecopyresampled($image_p$image0000$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_path100)) {
        
    // если все замечательно, создаем файл миниатюры, метод немного отличается для разнообразия от того, что описан выше, если захотите можете потренироваться и сделать создание миниатюр так же как и выше
                
    $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$image00$w_point$h_point$thumb_width$thumb_height$thumb_width$thumb_height);
                
    imagejpeg($thumb$thumb_path100);
        
    // описываем вывод, опять же, если захотите можете выводить запрос в базу данных или куда еще будет угодно
                
    $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 и т.д.
    ?>
     
  2. shaen

    shaen Постоялец

    Регистр.:
    23 июн 2011
    Сообщения:
    51
    Симпатии:
    9
    Посмотри 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;
    }
     
  3. irkmos

    irkmos Создатель

    Регистр.:
    7 май 2007
    Сообщения:
    48
    Симпатии:
    4
    Я в этом ничего не понимаю поэтому попросил поправить для корректной работы скрипта, это именно то что мне нужно.
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    да миниатюра там не изменяется, надо делать как выше картинка пропорционально изменяется так и с миниатюрой, а вообще действия одни и те же с картинкой или с миниатюрой только размер разный, поэтому можно вынести процесс создания отдельно функцией. Да и соединение с базой лучше проверять перед созданием картинки. И вычисление нового пропорционального размера можно попроще сделать. И 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$image000$h_point$thumb_width$thumb_height$width_original$height_original_new);
        }else{
            
    //точка отрезания по ширине
            
    $w_point = (($width_original $width_original_new) / 2);
            
    imagecopyresampled($thumb$image00$w_point0$thumb_width$thumb_height$width_original_new$height_original);
        }
        
    imagejpeg($thumb$thumb_path100);
    }
     
    // поехали :) 
    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_path150113$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>
            <?
    }
     
  5. irkmos

    irkmos Создатель

    Регистр.:
    7 май 2007
    Сообщения:
    48
    Симпатии:
    4
    Спасибо. Все работает как надо. Пригодиться думаю многим.
     
Статус темы:
Закрыта.