Как изменить размер изображения на PHP? Часть 2: Создаём миниатюры thumbnails

« Предыдущая запись
 
  Следующая запись »
 

phphelp Как изменить размер изображения на PHP? Часть 2: Создаём миниатюры thumbnails Несмотря на то, что я сейчас нахожусь вдалеке от своего кабинета в командировке, статью я таки публикую. То, чего ждали некоторые читатели, теперь написано и предоставляется здесь. Повестка дня – масштабирование изображений и генерация thumbnails при помощи PHP.

На эту тему достаточно статей. Некоторые интересные, некоторые дают только теорию, некоторые только практику, а некоторые непонятно вообще зачем написаны.

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

Прежде всего две вещи. Во-первых, я буду использовать термин оригинал изображения и холст миниатюры. Если с первым понятно, то на тему второго поясню, что мы из оригинала изображения будем копировать на созданное заново изображение, т.е. по сути для миниатюры будет создан холст. Во-вторых, составим перечень свойств, которыми должен обладать скрипт.

Задача - создать скрипт для работы с изображениями, обладающий следующими функциями:

  1. Должен работать с jpeg, gif, png.
  2. Позволяет уменьшать изображения до заданной ширины или высоты
  3. Позволяет создавать миниатюры (thumbnails) изображений, подчиняющиеся правилам:
    а) Если ширина и высота исходного изображения больше, чем у холста миниатюры, то изображение должно быть уменьшено так, чтобы оно полностью заняло поле холста миниатюры. При этом, если какие-то части уменьшенного изображения будут вылезать за пределы холста миниатюры, то они должны быть обрезаны.
    б) Если ширина изображения больше, чем ширина холста миниатюры, а высота меньше, то изображение центрируется на холсте миниатюры, его выступающие части обрезаются, а пустые места заливаются указанным цветом.
    в) Если высота изображения больше, чем высота холста миниатюры, а ширина меньше, то изображение центрируется на холсте миниатюры, его выступающие части обрезаются, а свободное место заливается указанным цветом.
    г) Если высота и ширина изображения меньше, чем высота и ширина холста миниатюры, то изображение центрируется на холсте миниатюры, а свободное место заливается указанным цветов.
  4. Исходя из предыдущих пунктов, функция должна позволять указывать цвет заливки, а также качество изображения, в случае jpeg формата.

Функция представлена чуть ниже. По ходу описания я не буду пояснять свойства функций работы с изображениями, т.к. они описаны в соответствующей статье - Как изменить размер изображения на PHP? Часть 1: функции работы с изображениями. Итак, рассмотрим теперь функцию, которая осуществляет все перечисленные выше пункты.

function image_resize($src, $dest, $width, $height, $rgb=0x000000, $quality=100) {
  if (!file_exists($src)) return false;
  $size = getimagesize($src);
  if ($size === false) return false;
  if ($width=='0' &&  $height=='0') return false;
  $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
  $icfunc = 'imagecreatefrom'.$format;
  $icfunc2 = 'image'.$format;
  if (!function_exists($icfunc)) return false;
  if (!function_exists($icfunc2)) return false;
  $isrc = $icfunc($src);
  if ($height=='0') {
    $height = floor( $width * ( $size[1] / $size[0] ) );
    $idest = imagecreatetruecolor($width, $height);
    imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
    if ($format=='jpeg') $icfunc2($idest, $dest, $quality);
    else $icfunc2($idest, $dest);
  }
  elseif ($width=='0') {
    $width = floor( $height * ( $size[0] / $size[1] ) );
    $idest = imagecreatetruecolor($width, $height);
    imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
    if ($format=='jpeg') $icfunc2($idest, $dest, $quality);
    else $icfunc2($idest, $dest);
  }
  else {
    $idest = imagecreatetruecolor($width, $height);
    imagefill($idest, 0, 0, $rgb);
    if ($size[0]<$width && $size[1]<$height) {
      $new_left = floor(($width - $size[0]) / 2);
      $new_top  = floor(($height - $size[1]) / 2);
      imagecopy($idest, $isrc, $new_left, $new_top, 0, 0, $width, $height);
      if ($format=='jpeg') $icfunc2($idest, $dest, $quality);
      else $icfunc2($idest, $dest);
    }
    elseif ($size[0]<$width && $size[1]>$height) {
      $new_left = floor(($width - $size[0]) / 2);
      $new_top  = floor(($size[1] - $height) / 2);
      imagecopy($idest, $isrc, $new_left, 0, 0, $new_top, $width, $height);
      if ($format=='jpeg') $icfunc2($idest, $dest, $quality);
      else $icfunc2($idest, $dest);
    }
    elseif ($size[0]>$width && $size[1]<$height) {
      $new_left = floor(($size[0] - $width) / 2);
      $new_top  = floor(($height - $size[1]) / 2);
      imagecopy($idest, $isrc, 0, $new_top, $new_left, 0, $width, $height);
      if ($format=='jpeg') $icfunc2($idest, $dest, $quality);
      else $icfunc2($idest, $dest);
    }
    else {
      $new_width = $width;
      $new_height = floor( $size[1] * ( $new_width / $size[0] ) );
      $new_left = '0';
      $new_top  = floor(($new_height - $height) / 2);
      if ($new_height<$height) {
        $new_height=$height;
        $new_width = floor($size[0] * ($new_height / $size[1]) );
        $new_left = floor(($new_width - $width) / 2);
        $new_top = '0';
      }
      $idest2 = imagecreatetruecolor($new_width, $new_height);
      imagecopyresampled($idest2, $isrc, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
      imagecopy($idest, $idest2, 0, 0, $new_left, $new_top, $width, $height);
      if ($format=='jpeg') $icfunc2($idest, $dest, $quality);
      else $icfunc2($idest, $dest);
      imagedestroy($idest2);
    }
    imagedestroy($isrc);
    imagedestroy($idest);
  }
  return true;
}
  1. Строки 1-2. Инициализируем функцию.  $src - имя исходного файла, $dest - имя генерируемого файла, $width, $height - ширина и высота генерируемого изображения в пикселях. Необязательные параметры: $rgb - цвет фона, по умолчанию - чёрный, $quality - качество генерируемого JPEG, по умолчанию - максимальное (100).
  2. Строка 3. Проверяем есть ли указанный файл и если нет, то функция вернёт false.
  3. Строка 4. Вызываем функцию getimagesize и получаемый массив помещаем в $size.
  4. Строка 5. Проверка на получение размеров изображения - если она не проходит, значит функция вернёт false.
  5. Строка 6. Если вызываемой функции ширина и высота передаются равными нулю, то тоже функция вернёт false.
  6. Строка 7-8. Вытаскиваем исходный формат изображения по mime-типу.
  7. Строки 9-10. По вытащенному формату изображению создаются имена двух функций для работы с изображениями. Это для поддержки gif, jpg и png.
  8. Строка 11-12. Проверяем существуют ли такие функции, которые мы создали строками ранее.
  9. Строка 13. Вызываем созданную нами функцию (которая imagecreatefrom).
  10. Строка 14. Если функции была передана высота равная нулю, то это значит, что необходимо не создание миниатюры, а просто уменьшение изображения с указанной максимальной шириной.
  11. Строка 15. Вычисляем новую высоту изображения исходя из исходных параметров и переданной максимальной ширины.
  12. Строка 16. Создаём пустое изображение true color.
  13. Строки 17-18. Функция берёт исходное изображение, масштабирует его и переносит на свежесозданный холст (из строки 16).
  14. Строки 19-20. Записывается изображение в файл. При этом, если файл jpeg, то для него вызывается функция с передачей качества самого жпега.
  15. Строка 22. Подобна строке 14, только рассмотрено для случая, когда была передана ширина равной нулю.
  16. Строки 23-28. Схожу со строками 15-20.
  17. Строка 30. Если переданы нормальные ширина и высота, то выполняется следующий блок кода.
  18. Строки 31-32. Создаётся изображение true color и заливается нужным цветом.
  19. Строка 33. Если высота и ширина загруженного изображения меньше ширины и высоты холста миниатюры, то…
  20. Строки 34-35. Вычисляем позиции отступов сверху и слева для того, чтобы разместить оригинал изображения по центру холста миниатюры.
  21. Строки 36-39. Копируем оригинал изображения на холст миниатюры и сохраняем его в файл.
  22. Строка 41. Если ширина исходного изображения меньше ширины холста, а высота больше, то…
  23. Строка 42-47. Приблизительно тоже самое, что и в 34-39 строках.
  24. Строки 49-55. Подобно строка 41-47, но здесь рассматривается случай, когда ширина исходного изображения больше ширины холста, а высота меньше.
  25. Строка 57. За ней блок кода распространяется на случаи, когда ширина и высота оригинала больше, чем ширина и высота холста миниатюры.
  26. Строки 58-61. Задаём новую ширину для изображения и, в соответствии с ней, пропорционально высчитываем высоту. Тут же высчитываем координаты отступов, чтобы картинка была по центру холста.
  27. Строки 62-67. В случае, если при перерасчёте в предыдущем пункте получилось, что высота меньше, чем высота холста миниатюры, то тут мы уже задаём новую высоту изображения и исходя из неё высчитываем ширину. Затем высчитываем координаты отступов, чтобы картинка была по центру холста.
  28. Строки 68-70. Создаём новое изображение true color и копируем в него с уменьшением исходное изображение.
  29. Строки 71-72. Полученное в прошлом пункте изображение теперь копируем на холст миниатюры.
  30. Строки 73-74 уже знакомы - они сохраняют файл.
  31. Строки 75-78. Освобождают память от созданных темповых изображений.

И теперь наглядный пример. Я ничего пояснять не буду, есть пояснения в коде, думаю там всё просто.

<form method="post" name="image_load" enctype="multipart/form-data">
    <p><label for="file">Изображение: <span></span></label><br>
    <input name="file" type="file" value="" size="50"></p><br>
    <input type="submit">
</form>
<?php
if (isset($_POST)) {
    $url_name_gal = 'folder'; //имя папки, в которую будем сохранять файлы
    $imgs_width_gal = '500'; //максимальная ширина картинки
    $thumb_width_gal = '100'; //ширина для миниатюры
    $thumb_height_gal = '75'; //высота для миниатюры
    ini_set('memory_limit', '64M'); //увеличиваем размер оперативки для работы с изображениями, а то крупных картинок не загрузишь
    $file = $_FILES['file']['tmp_name'];
    $filename = $_FILES['file']['name'];
    $size = getimagesize($_FILES['file']['tmp_name']); //получаем массив значений размеров картинкии  её расширения
    $mime = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1)); //узнаём mime-тип изображений
    if ($mime=='jpeg') $format = 'jpg'; else $format = $mime; //если mime jpeg, то он будет записан как файл .jpg
    $new_filename = 'image'.time().'.'.$format; //генерируем новое имя файла
    copy($file, $url_name_gal.'/'.$new_filename); //копируем файл
    //если ширина картинки превышает максимальную, то уменьшаем картинку до допустимого максимума и сохраняем.
    if ($size['0']>$imgs_width_gal) {
        if (image_resize($url_name_gal.'/'.$new_filename, $url_name_gal.'/'.$new_filename, $imgs_width_gal, '0'))
            echo 'Изображение было уменьшено до указанной ширины в '.$imgs_width_gal.'px. <br>';
    }
    //создаём миниатюру для загруженной картинки
    if (image_resize($url_name_gal.'/'.$new_filename, $url_name_gal.'/thumbs/'.$new_filename, $thumb_width_gal, $thumb_height_gal)) echo 'Создание миниатюры произведено успешно';
    else echo 'Миниатюра создана не была.';
}
?>

Да, обращаю внимание на то, что чтобы пример работал, нужно создать заранее все указанные папки, куда будут записаны миниатюры и исходные изображения.

 

 

В конце хочу сказать, что функцию я писал не с нуля, была предпосылка – когда-то давно мной был найден скрипт (где, не помню), который я впоследствии переработал, изменил и добавил нужные опции. Поэтому он может быть немного похож на тот скрипт, который я когда-то откуда-то взял. Хотя думается, то похожесть в большей степени будет в названии переменных.

Буду рад Вашим комментариям, замечаниям и пожеланиям! Не стесняйтесь, пишите! В выходные вернусь из командировки и с удовольствием отвечу на все вопросы =).

P.S.: Алексей Агеев (он же Alex.Veider) дописал скрипт, расширив его функционал, включая работу с прозрачностью, за что ему отдельный респект и уважуха. Скачать скрипт можно чуть ниже.

 

 

 

Ссылки по теме

,

1 звезда2 звезд3 звезд4 звезд5 звезд (голосов: 2, средний: 3.00 из 5)
Понравилась статья или журнал? Подписывайся на продолжение!
Отзывов: 59 на запись

"Как изменить размер изображения на PHP? Часть 2: Создаём миниатюры thumbnails"

  1. у меня почему при:

    if (isset($_POST['file'])) {..}

    не заработал скрипт.. поменял на:

    if (isset($_POST)) {..}

    все ок

  2. потому что должен быть инпут с неймом file.

  3. Добрый день, не работает опция смены фона, при любых комбинация фон всегда черный :( . Разобраться самому так и не получилось. А вообще функция хорошая спасибо!

  4. ммм, надо проверить будет, потому что я помню, что делал фон белым. Видимо когда переписывал функцию, что-то упустил.
    а так пожалуйста =)

  5. Артемий
    23/09/2010 at 14:52 Постоянная ссылка Цитировать

    Вот именно ТАК появляется быдлокод и быдлокодеры. Извините за резкость. )

  6. 2Артемий, ммм, был бы очень признателен за конструктивную критику, если Вы не против =).
    Гораздо актуальнее, как мне кажется, использовать какую-нибудь библиотеку, типа GD, где уже всё предусмотрено и сделано, но этот пример тоже имеет право жить для малых нужд. Или всё таки нет? =)

  7. Спасибо разобрался. Оказалось чтобы получить исходное имя файла на выходе надо поменять в 24 строке старую запись на

    $new_filename = $filename.’.';

  8. да, про это я и говорил в почте =)

  9. А если в php есть ограничение на обрабатываемый скрипт (к примеру 2 Мб), то можно ли как-то отслеживать будет ли превышен этот размер (т.е. вес оригинальной фотки + масштабируемой фотки + дополнительные параметры скрипта не превышают 2Мб). Изменять параметры в php нельзя (доступа нету)…

  10. вообще, если надо “поменять” эти настройки, используется ini_set, где как раз можно увеличить дефолтовые значения. для этого в скрипте выше и написана строка ini_set(‘memory_limit’, ‘64M’) – чтобы загружать крупные фотки

  11. Если Вам несложно, подскажите простой способ, чтобы создать превью для картинок, вызываемых из пользовательских полей в шаблон.

    Что сейчас есть в шаблоне:


    <a href="">

    То есть, проверяется, была ли в определённое поле внесена картинка, и если да, код её выводит в пост, при нажатии на картинку открывается она же. И там, и там сейчас грузится оригинал(((никак не соображу, что добавить в код, чтобы в пост выводилось превью, уменьшенное, к примеру, на 50% от оригинала. Подскажите, а? Туплю, видимо((


  12. <a href="">

  13. Насколько я понял, нужно лишь при загрузке добавить несколько строк, чтобы создавалась миниатюра, а потом править код так, чтобы в месте, где нужно уменьшенное изображение, выводилось оно самое. Об уменьшении изображения статья выше, а остальное – смотрится по месту. Или я не очень понял суть вопроса?

  14. Спасибо.

  15. Пожалуйста.

  16. Эдуард
    01/05/2011 at 17:35 Постоянная ссылка Цитировать

    Ага, быдло вижу здесь только одно. Артемий, мож ты и не быдлокодер, но ты быдло по жизни, во-первых, ты по всей видимости действительно не слышал (как правильно заметил автор блога) о конструктивной критике, во вторых, ты сам что сделал, что бы “быдлокодеров” было меньше? Пишу потому что, много стало у нас “крутых” кодеров я смотрю, и единственное, что они делают, пишут такие комменты как ты, Артемий.

  17. Наталья
    13/05/2011 at 13:25 Постоянная ссылка Цитировать

    Здравствуйте! А у меня почему то скрипт не сработал. То есть после попытки загрузки фото никаких сообщений – “Создание миниатюры произведено успешно” или “Миниатюра создана не была” не выводится и в папках folder и thumbs ничего не появляется. Подскажите пожалуйста, что это может быть?

  18. Добрый день, Наталья!
    Не глядя трудно сказать, попробуйте скопировать код ещё разок и попробовать снова. Либо скиньте мне ваши файлы на почту

  19. Наталья
    13/05/2011 at 14:15 Постоянная ссылка Цитировать

    Александр, спасибо за такой быстрый ответ – я послала сообщение в почту. Если не трудно – посмотрите пожалуйста.

  20. Пожалуйста!
    Посмотрел, ответил, теперь всё работает =)

  21. Георгий
    12/07/2011 at 23:31 Постоянная ссылка Цитировать

    Спасибо за функцию.
    Только вот изменить цвет фона никак не получается… буду очень рад помощи.

  22. пожалуйста!
    тогда покажите строчку как вы задаёте цвет фона

  23. Здравствуйте, уважаемые (и не очень) коллеги и гости страницы. Здравствуйте, автор-кудесник.

    Ваш код это просто сказка, душа поет как птица, благодаря тому, что я сбросил бремя изобретения велосипеда и воспользовался вашим чудным решением.

    Но поэксперементировав с сим предметом, и проведя детальный аудит кода, я заметил у него ряд мелких, но существенных недостатков, а так же нескольких несущественных багов:

    1). Не корректная заливка цветом полотна, в ряде случаев, залавает частично черным, частично выбранным.

    2). Не меняет формат изображения. Нельзя просто использовать функцию для конвертирования формата изображения. (теперь меняет – по расширению)

    3). Черный цвет по умолчанию не лучшее решение, графически светло серый будет нейтральнее и универсальние.

    Посему, я взял на себя смелость исправить указанные недочеты и привести здесь исправленный код, что не умаляет заслуг автора этого шедевра, проделавшего, по видимому значительный труд.

    Благодарю, господа, и за поздним часом откланиваюсь.
    Всегда рад оказать услугу, el_prince


    function image_resize($src, $dest, $width, $height, $rgb = 0xEEEEEE, $quality = 100)
    {

    if(!file_exists($src))
    {
    return false;
    }
    $size = getimagesize($src);

    if($size === false)
    {
    return false;
    }

    if($width == '0' && $height == '0')
    {
    return false;
    }
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
    $usformat = pathinfo($dest);
    $usformat = $usformat['extension'];

    if($usformat == "jpg")
    {
    $usformat = "jpeg";
    }
    $icfunc = 'imagecreatefrom'. $format;
    $icfunc2 = 'image'. $usformat;

    if(!function _exists($icfunc))
    {
    return false;
    }

    if(!function _exists($icfunc2))
    {
    return false;
    }
    $isrc = $icfunc($src);

    if($height == '0')
    {
    $height = floor($width * ($size[1] / $size[0]));
    $idest = imagecreatetruecolor($width, $height);
    imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);

    if($usformat == 'jpeg')
    {
    $icfunc2($idest, $dest, $quality);
    }
    else
    {
    $icfunc2($idest, $dest);
    }
    }
    elseif($width == '0')
    {
    $width = floor($height * ($size[0] / $size[1]));
    $idest = imagecreatetruecolor($width, $height);
    imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);

    if($usformat == 'jpeg')
    {
    $icfunc2($idest, $dest, $quality);
    }
    else
    {
    $icfunc2($idest, $dest);
    }
    }
    else
    {
    $idest = imagecreatetruecolor($width, $height);
    imagefill($idest, 0, 0, $rgb);

    if($size[0] < $width && $size[1] < $height)
    {
    $new_left = floor(($width - $size[0]) / 2);
    $new_top = floor(($height - $size[1]) / 2);
    imagecopy($idest, $isrc, $new_left, $new_top, 0, 0, $size[0], $size[1]);

    if($usformat == 'jpeg')
    {
    $icfunc2($idest, $dest, $quality);
    }
    else
    {
    $icfunc2($idest, $dest);
    }
    }
    elseif($size[0] < $width && $size[1] > $height)
    {
    $new_left = floor(($width - $size[0]) / 2);
    $new_top = floor(($size[1] - $height) / 2);
    imagecopy($idest, $isrc, $new_left, 0, 0, $new_top, $size[0], $size[1]);

    if($usformat == 'jpeg')
    {
    $icfunc2($idest, $dest, $quality);
    }
    else
    {
    $icfunc2($idest, $dest);
    }
    }
    elseif($size[0] > $width && $size[1] < $height)
    {
    $new_left = floor(($size[0] - $width) / 2);
    $new_top = floor(($height - $size[1]) / 2);
    imagecopy($idest, $isrc, 0, $new_top, $new_left, 0, $size[0], $size[1]);

    if($usformat == 'jpeg')
    {
    $icfunc2($idest, $dest, $quality);
    }
    else
    {
    $icfunc2($idest, $dest);
    }
    }
    else
    {
    $new_width = $width;
    $new_height = floor($size[1] * ($new_width / $size[0]));
    $new_left = '0';
    $new_top = floor(($new_height - $height) / 2);

    if($new_height < $height)
    {
    $new_height = $height;
    $new_width = floor($size[0] * ($new_height / $size[1]));
    $new_left = floor(($new_width - $width) / 2);
    $new_top = '0';
    }
    $idest2 = imagecreatetruecolor($new_width, $new_height);
    imagecopyresampled($idest2, $isrc, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
    imagecopy($idest, $idest2, 0, 0, $new_left, $new_top, $size[0], $size[1]);

    if($usformat == 'jpeg')
    {
    $icfunc2($idest, $dest, $quality);
    }
    else
    {
    $icfunc2($idest, $dest);
    }
    imagedestroy($idest2);
    }
    imagedestroy($isrc);
    imagedestroy($idest);
    }
    return true;
    }

  24. Доброе утро!

    Большое спасибо за лестный отзыв, стараемсо =)
    Однако, кроме первого пункта, я бы не сказал, что недостатки можно назвать существенными. Но всё равно большое спасибо за проделанную работу.

    Первое исправление – сам не сталкивался, но теоретически где-то могло быть. Хотя как-то странно. Если ткнёте местом в код буду очень признателен (вручную смотреть сейчас просто не предоставляется возможным).
    Второе. Как понимаю, это для случаем, когда был? к примеру, формат у файла гиф и вручную ему прописали формат jpeg? В принципе, хорошая вещь для защиты от дурака, но шанс на то, чтобы так вышло – крайне минимальный.
    Что касается чёрного-серого цвета. Я обычно цвет выбираю в зависимости от цветовой схемы сайта. Иногда чёрный подойдёт, иногда белый, иногда серый. При этом, серый тоже нужно выбрать из кучи их вариаций, потому что где-то один подойдёт, а где-то нет. А как универсальный, думаю серый подойдёт, чтобы не заморачиваться новичкам с его заменой :)

    Ещё раз спасибо за очень содержательный комментарий!

  25. Anvar[apwa.ru]
    30/10/2011 at 18:49 Постоянная ссылка Цитировать

    Редактировал свою галерею и не мог найти решения для создания миниатюр, с конкретно указаной высотой и шириной, до этого у меня было просто определённое колличество пикселов пропорционально либо в ширь, либо вверх.

    Какбы нашёл решение, но ваш способ не заработал, но всёже сделал так и вуаля)))

    В 71 строке

    Перед
    imagecopy($idest, $idest2, 0, 0, $new_left, $new_top, $width, $height);

    Вставил
    $idest = imagecreatetruecolor($width, $height);

  26. хм, странно, должно работать итак – вставленная строка выполняется чуть ранее в 31. ну да ладно, главное, что всё работает!=)

  27. странно, исходники поставил на сайт и при загрузке изображений ничего не просходит, ничего не генерируется. Что нужно сделать? Спасибо

  28. проверьте права на запись в нужную директорию и наличие самой директории

  29. А как права посмотреть? Я на локальном хосте проверяю. Ваши исходки в чистый каталог положил и больше ничего не делал. В папке есть этот php обработчик, пака folder и в ней папка thumbs

  30. тогда всё окей должно быть)
    там дело в какой-то мелочи, так что смотрите внимательнее, трудно что либо конкретнее ответить

  31. так и не нашел где проблема в коде.. у меня одного только не работает :) а вы можете проверить свои иходники? если у вас они заработают, значит попробую на удаленных хост залить :)

  32. попробуйте почитать ещё комменты выше, там была проблемка странная, может поможет её решение.
    а вообще пример я заливал после тестирования, всё работало без проблем. так что сразу на удалённом пробуйте =)

  33. у меня почему при:

    if (isset($_POST['file'])) {..}

    не заработал скрипт.. поменял на:

    if (isset($_POST)) {..}

    все ок

    ———–

    С таким же методом заработало.. непонятно почему с if (isset($_POST['file'])) {..} скрипт не работает, переменная $file из формы ведь передается..

    изменил на if ($_POST['file'] == “”) {…} и по-прежнему работает, очень очень странно, Александр :)

  34. ммм, странно. может от версии пхп что-то зависит.
    главное, что проблема решилась)

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

  36. да, более чем возможно =)

  37. Спасибо, буду задротить функцию mkdir, классно было бы, если б урок по ней был, как по типу этого :)

  38. я уже давно думаю написать статью по работе с директориями, но пока руки не доходят =)

  39. Добрый вечер, Александр! Нужно было ресайзить изображения в одну папку, ваш код под себя отредактировал и все нормально, но как можно проверку сделать, чтобы разрешено было отправлять только картинки? Сейчас же любые файлы отправляю и они закидываются в папку вместе с картинками… :)
    В коде вставил if($mime != "jpg" or $mime != "jpeg" or $mime != "gif" or $mime != "png") {exit("Загружать можно только изображения!");}
    но почему-то условие всегда ложное и скрипт останавливается, даже если картинки пытаться загружать, скажите пожалуйста как лучше правильно сделать :)

    $url_name_gal = 'uploads'; //имя папки, в которую будем сохранять файлы
    $thumb_width_gal = '118'; //ширина для миниатюры
    $thumb_height_gal = '88'; //высота для миниатюры
    ini_set('memory_limit', '64M'); //увеличиваем размер оперативки для работы с изображениями, а то крупных картинок не загрузишь
    $file = $_FILES['file']['tmp_name'];
    $filename = $_FILES['file']['name'];
    $size = getimagesize($_FILES['file']['tmp_name']); //получаем массив значений размеров картинкии её расширения
    $mime = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1)); //узнаём mime-тип изображений

    if($mime != "jpg" or $mime != "jpeg" or $mime != "gif" or $mime != "png") {exit("Загружать можно только изображения!");}
    if ($mime=='jpeg') $format = 'jpg'; else $format = $mime; //если mime jpeg, то он будет записан как файл .jpg
    $new_filename = 'image-'.time().'.'.$format; //генерируем новое имя файла
    copy($file, $url_name_gal.'/'.$new_filename);
    image_resize($url_name_gal.'/'.$new_filename, $url_name_gal.'/'.$new_filename, $thumb_width_gal, $thumb_height_gal);

  40. И если вам не будет трудно, можете пожалуйста объяснить как удалить часть информации из таблицы с данным. С запросом UPDATE, то есть вытащить всю инфу из ячейки, найти в ней часть инфы, верезать и потом обновить уже?

    Ваша чудо формочка
    Пока сделал так http://othersite.anapa-kurort.net/index.php Правда с экрана картинка удаляется после обновления страницы(2 раза аж)

    По нажатию на картинку идет удаление ее из папки, но ее запись в таблице присутствует…и следователь будет на экран выводиться пустое изображение. Вот хотелось бы полностью удалять. :) Но пока не встречал такого запроса, чтоб можно было часть инфы только обновить.

    Вообщем добавляю в ячейку новые картинки

    $result = mysql_query("SELECT img FROM file");
    $myrow = mysql_fetch_array($result);
    $all = $myrow['img'];

    $time = time();
    mysql_query("UPDATE file SET img='".$all."<a href=index.php?id=$time&format=$format><img src=uploads/$new_filename></a>"."'"." WHERE id=1");

    Сначала вытащил все поле и потом к текущему полю добавил еще одну картинку.. А сейчас зашел в тупик... а как же тогда удалить часть и при этом обновить, танцы с бубнами не помогают :)

    Пока есть представление как сделать:

    1. вытащить эту ячейку с картинками $result = mysql_query("SELECT img FROM file");
    $myrow = mysql_fetch_array($result);
    $all = $myrow['img'];
    2. найти в ней ссылку с картинкой:

    Каждая добавленная картинка в базе имеет примерно такой вид
    <a href=index.php?id=1324165163&format=jpg><img src=uploads/image-1324165163.jpg></a>

    Человек кликает по картинке и летят данные $_GET['id'] и $_GET['format']

    Ну и чтоб найти в ячейки таблицы то, что нужно, напишем так:
    <a href=index.php?id=$_GET['id']&format=$_GET['format']><img src=uploads/image-$_GET['id'].$_GET['format']></a>

    И думаю составить еще один какой-то запрос, чтоб найти это совпадение, удалить его как-то и занести обрезанный вариант в переменную и потом уже обновлять таблицу :)

  41. ну, на тему проверки расширения, можно, например, сделать так:

    $extentions = array( “gif”,”jpg”,”jpeg”,”png”);
    $type = strtolower(substr($_FILES['file']['tmp_name'], 1+strrpos($_FILES['file']['tmp_name'],”.”)));
    if(!in_array($type,$extentions)) die();

    или так

    $imageinfo = getimagesize($_FILES['file']['tmp_name']);
    if($imageinfo['mime'] != ‘image/gif’ && $imageinfo['mime'] != ‘image/jpeg’) die();

    как видите, в целом это разделёный надвое ваш пример =)

    а на тему второго варианта – не очень понимаю зачем всё это. что должно происходить когда мы кликаем по картинке? Просто удаляться? Тогда почему бы не написать DELETE FROM database WHERE…, а потом добавить новую строку. Правда вот тут не понимаю что за новая строка и для чего. Объясните поподробнее, тогда разрулим =)

  42. Спасибо биг, с первым вопросом по расширениям разобрался :)

    Есть одна огромная таблица, где пользователи могу управлять своей инфой, редактировать и в ней же есть ячейка куда они могут загрузить новые фотки и посомтреть уже что есть(это сделано), и из этой же ячейки нужно как-то удалить часть инфы(картинку). Да, вы правильно сказали, что можно создать одну еще одну таблицу и потом просто через DELET чистить, но а если 100 человек будут закидывать картинки в одну таблицу, это ведь венегред будет :) (хотя если привязать их к id пользователя и сделать над каждой картинки ссылку на удаление, то все окей должно быть) Просто я думал, круто было бы если в одной записи есть все- вся информация о человек, все что он загрузил и тп и в этой же записи как-то удалять картинки, если понадобится. Скорее всего ваш вариант и попробую :)

    Заметил одну вещу- на локальном хосте картинки в бд и в папку закидываются в одно время time(); и ссылка на удаление тоже в одно время создается.

    А вот загрузил все это дело на удаленный хостинг и ногда бывает, что ссылка формируется на 1 секунду или милисекунду раньше(где-то 1 из 5 картинок всегда с задержкой), чем все остальное! и удаление не будет работать :) Я аж вчера сижу и думаю, а что можно сделать… Может это от сервера зависит? у меня сервер за 30р. в месяц, может по этому…

  43. вру, только что на локальном хосте загрузил картинку и ссылка на удаление сформировалась на 1 сек раньше. ппц.

  44. классно, теперь нормально удаляются http://othersite.anapa-kurort.net/index.php :)

  45. ну, всё в одном месте это нехорошо. по возможности статичные данные, которые почти не меняются, стоит держать в отдельной таблице, а те, которые постоянно меняются – в другой. Ну и связывать их по ключу =)

  46. да, все сделал в отдельной таблице, как вы сказали :) а теперь думаю реализовать водяные знаки- накладывать поверх этих изображений еще одно..

    нашел функцию imagecopyresized($img,$logo,10,10,0,0,200,30,200,30)
    но пока не втыкаю что к чему, а именно $img и $logo- что это? числа я так понял что это координаты :)

  47. http://shublog.ru/examples/2010.07.27-img-func.html
    собственно из предыдущей статьи. тут написано про функции работы с изображениями=)

  48. Спасибо, статья хорошая! Только нашел баг или тако должно быть, но картинки больше 2мб не грузятся… Определяет как “неизвестный формат”.. Сначала думал что это от разрешения зависит. Создал в фотошопе картинку 35кб с разрешением 6500х4500 и нормально загрузилась. Не знаете где можно подправить это? :)

    в вашем скрипте видел такую строчку

    ini_set('memory_limit', '64M'); //увеличиваем размер оперативки для работы с изображениями, а то крупных картинок не загрузишь

    Менял с 64M на 1024M и не помогло, что нужно сделать? :(

  49. проблему решил, добавив

    php_value upload_max_filesize 100M
    php_value post_max_size 100M

    в .htaccess :)

  50. Правильно сделали =)

  51. Виталий
    10/01/2012 at 12:41 Постоянная ссылка Цитировать

    Добрый день
    Долго искал что то подобное.
    Огромное спасибо

  52. Рад быть полезным! =)

  53. За сам скрипт огромное спасибо, использовал в работе, только немного подправил под свои нужды (соблюдение пропорций и “необходимость” обрезки если реальные размеры бла бла бла бла )

    Кому интересно по цвету фона ответ, отвечаю.

    с прозрачными PNG необходимо работать отдельно, просто сделав условие проверки расширения файла и добавить несколько функций.

    вместо кода
    $idest = imagecreatetruecolor($width, $height);

    поставить
    $idest=imagecreate($width, $height);
    imagealphablending($idest, false);
    imagesavealpha($idest, true);

    остальной функционал для определения пропорций ( и т.д.) можно не менять.
    главное просто будьте внимательны при построении условий. кому интересно изменённый мной класс получить - пишите на почту alex.veider@gmail.com, чем смогу помогу, только в теме письма уточните что необходимо и подпишитесь. Успехов!

  54. Скажите плз что нужно в функции изменить, чтоб у png картинок оставался прозрачный фон?

  55. Александр Шуйский
    27/05/2012 at 22:17 Постоянная ссылка Цитировать

    2Саша. Читайте ответ выше. А ещё покопайте в сторону ImageColorTransparent

  56. СПасибо, все получилось! png картинки теперь прозрачные, а не этот ужасный черный фон! :) )

  57. Уважаемые коллеги и другие интересующиеся, наш доблестный гуру Александр Шуйский в конце материала (текста статьи) выложил для скачивания архив с моими дополнениями для обработки прозрачных PNG. . Скрипт проверен и успешно работает в онлайн проектах.
    Обработка прозрачности стала актуальной темой давно. Данные болезненные вопросы неоднократно задавались на просторах интернета, но не так легко найти необходимый материал, но нет ничего невозможного.
    Главное правильное место роста рук и кривизна извилин мозга. Желаю всем успехов!
    При возникновении вопросов пишите на alex.veider@gmail.com.

  58. Добрый день.

    У меня возникла сложность в одном моменте. Если можно помогите пожалуйста.

    Мне необходимо, чтобы оставался оригинальный фон заданный для всего сайта, но после добавления миниатюр к статьям, изображение со статей стало автоматом влазить в фон. Пример здесь: http://cosmogenus.ru/zoroastrizm/xumo.html

    Как я понимаю, нужно корректировать этот код:

    if( is_front_page() || is_home() ){
    for ($i=1;$i<6;$i++) {
    if ( of_get_option('slide'.$i, true) != "" ) {
    $imgUrl = esc_url( of_get_option('slide'.$i, true) );
    $imgTitle = esc_html( of_get_option('slidetitle'.$i, true) );
    $imgDesc = esc_html( of_get_option('slidedesc'.$i, true) );
    $imgHref = esc_html( of_get_option('slideurl'.$i, true) );
    if( $imgUrl != '' ){
    echo '{image : \''.$imgUrl.'\', title : \'’.( ($imgHref!=” && $imgTitle!=”) ? ‘‘ : ”).$imgTitle.( ($imgHref!=” && $imgTitle!=”) ? ‘‘ : ”).”.$imgDesc.”.( ($imgHref != ”) ? ‘Подробнее ›‘ : ”).’\', thumb : \”.$imgUrl.’\', url : \’\'},’.”\n”;
    }
    }
    }
    }else{
    $featured_as_background = esc_html( of_get_option(‘featured_as_background’, true) );
    if($featured_as_background != 1 && has_post_thumbnail() ) {
    $large_image_url = wp_get_attachment_image_src( get_post_thumbnail_id(), ‘full’);
    $imgUrl = $large_image_url[0];
    echo ‘{image : \”.$imgUrl.’\', title : \’\', thumb : \”.$imgUrl.’\', url : \’\'},’.”\n”;
    }else{
    $page_bg_image_url = get_background_image();
    echo ‘{image : \”.$page_bg_image_url.’\', title : \’\', thumb : \”.$page_bg_image_url.’\', url : \’\'},’.”\n”;
    }
    }

    Но к сожалению не обладаю не знаниями, не навыками, чтобы самостоятельно его подправить.

    Буду очень признателен, если подскажите, что и как сделать.

    Заранее спасибо.

  59. Александр Шуйский
    14/08/2014 at 9:10 Постоянная ссылка Цитировать

    Доброго дня!
    Настройки темы, по всей видимости.
    Присылайте на почту детали, гляну.

Добро пожаловать, коллега! Вы можете оставить свой отзыв:





Допустимые XHTML-теги:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Подписка на комментарии