Превью картинки на PHP
Joined: 04 Oct 2008
Posts: 13
Location: Санкт-Петербург
Posted: Fri Jul 10, 2009 8:41 pm ( написано за 5 минут 21 секунду ) Post subject: Выдача превью изображений (thumbnails) «на лету» |
||||||||||||||||||||
Здравствуйте.
Хочу поделиться решением для вывода на сайте картинок нужного размера «на лету». Суть такова
И получаем то, что просили. Такой запрос преобразуется в .htaccess и перенаправляется на нужный скрипт, который делает ресайз по заданным параметрам (если ресайзнутой картинки еще нет), сохраняет измененную копию картинки (если разрешили сохранять) для последующих запросов и выдает в браузер готовое изображение. Решение — это файл thumb.php (нужный скрипт) и несколько строчек в .htaccess В файле .htaccess пишем (RewriteEngine уже должен быть «on»):
..И добавляем файл thumb.php в папку /includes Теперь, если в браузере написать адрес картинки с параметрами GET — сервер выдаст измененную картинку Рассмотрим параметры GET. Они таковы:
Здесь: Дальше больше. Параметры можно комбинировать. Размеры превью по умолчанию задаются в самом thumb.php (сейчас 150х150) Далее приведены возможные форматы имен создаваемых на диске превью (опять же, если превью разрешено сохранять на диск), в зависимости от заданных параметров.
Здесь размеры после image_ — это реальный рамер картинки после уменьшения. Как работает thumb.php Посмотреть и поиграть с параметрами можно здесь: t.8080.spb.ru/i/17.jpg Что мы получили? Данное решение работает на GD Что еще можно (вариации для размышления): Спасибо за внимание. Буду рад если это пригодится. UPD 2011-01-16: Теперь файл лежит здесь:
Last edited by Дмитрий Герасимов on Sun Jan 16, 2011 11:51 pm; edited 4 times in total |
Профессионал
Joined: 17 Aug 2003
Posts: 1850
Posted: Fri Jul 10, 2009 10:02 pm ( спустя 1 час 21 минуту ; написано за 1 минуту 3 секунды ) Post subject: |
|
Красиво. Немного похоже на вот это forum.dklab.ru/viewtopic.php?t=23038, но более узко специализировано, потому и лаконично. |
Заглянувший
Joined: 04 Oct 2008
Posts: 13
Location: Санкт-Петербург
Posted: Fri Jul 10, 2009 11:00 pm ( спустя 58 минут ; написано за 12 минут 51 секунду ) Post subject: |
|||
Действительно, похоже. |
Заглянувший
Joined: 21 Oct 2009
Posts: 2
Posted: Wed Oct 21, 2009 3:25 pm ( спустя 3 месяца 10 дней 16 часов 24 минуты ; написано за 56 секунд ) Post subject: |
|
есть класс старый phpThumb, он умеет еще эффекты применять, схема работы такая же, урл-реврайтинг делается за 5 секунд руками. |
Заглянувший
Joined: 23 Sep 2007
Posts: 8
Posted: Thu Oct 22, 2009 2:49 pm ( спустя 23 часа 23 минуты ; написано за 1 минуту 40 секунд ) Post subject: |
|
при большом кол-ве картинок (и их значительном размере) все это дело начинает тормозить. возникают проблемы с header’ами . сам довольно долго пользовал похожее решение у себя. но недавно переделал не в динамику . а автоматом создание нужных маленьких превьюшек. |
Guest
Posted: Mon Nov 16, 2009 5:45 pm ( спустя 25 дней 2 часа 56 минут ; написано за 13 секунд ) Post subject: не воспринимает в .htaccess |
|
не воспринимает в .htaccess |
Заглянувший
Joined: 19 Nov 2009
Posts: 1
Posted: Thu Nov 19, 2009 3:20 pm ( спустя 2 дня 21 час 34 минуты ; написано за 4 минуты 35 секунд ) Post subject: |
|
Огромнейшее спасибо автору за скрипт. Очень помог! А кто подскажет, как этому скрипту скормить картинку с другого сайта? Смысл таков — скрипт установлен у меня на хостинге, нужно сделать в браузере превью на изображение с другого сайта по имеющемуся прямому линку. |
Заглянувший
Joined: 31 May 2011
Posts: 3
Location: Москва
Posted: Tue May 31, 2011 3:31 pm ( спустя 1 год 6 месяцев 12 дней 11 минут ; написано за 8 минут 12 секунд ) Post subject: |
|||
Здравствуйте Дмитрий Герасимов.
Прошу помощи с вашим классом. добавл «rotate» Вот эта цифра «-90» — вытаскивается из фотографии на основе ориентации фотоаппарата. Всё крутится, но если изображение в оригинале сфотографировано на боку, то при разворачивании изображения появляется черная полоса. В других случаях всё работает идеально. Вот, то что у меня. Где исправить?
|
Заглянувший
Joined: 04 Oct 2008
Posts: 13
Location: Санкт-Петербург
Posted: Thu Jun 02, 2011 2:07 am ( спустя 1 день 10 часов 35 минут ; написано за 26 минут 21 секунду ) Post subject: |
|||||||||||||
Не совсем понял про ориентацию фотоаппарата, но я вижу проблему так: В скрипте, для изменения размеров картинки мы создаём новый уменьшенный холст и помещаем туда уменьшенное изображение. Если мы поворачиваем на 90 градусов, то мы должны плясать уже от размеров 300х400 а не 400х300, т.е. перед вычислением размеров нового холста, мы должны поменять местами оригинальные ширину и высоту картинки. В общем случае, можно принять, что мы всегда будем поворачивать картинку на угол, кратный 90 градусам и передавать в скрипт не величину угла, а количество поворотов.
И потом, при повороте указать (см. код из предыдущего поста)
Так же не забыть сделать замену
И убрать первые два добавленных блока ) Ещё надо позаботиться о сохранении файлов на диск, т.е. в имя добавлять значение поворота. |
Заглянувший
Joined: 31 May 2011
Posts: 3
Location: Москва
Posted: Thu Jun 02, 2011 3:01 am ( спустя 53 минуты ; написано за 5 минут 30 секунд ) Post subject: |
|||||||||||||||||||||||||||||||
Дмитрий Герасимов Спасибо большое за ответ. Поменял код как указанно. но что то поворот не так как хотеось бы срабатывает. По поводу поворота, то эта информация берется из фотографии стандартной функцией exif_read_data вот:
Обрезать изображение (crop)Пример вырезает из исходного изображения часть размером $w на $h . Результат
Поворот изображенияФункция imagerotate() поворачивает изображение на заданный угол против часовой стрелки, отрицательный угол меняет направление поворота. Поворот на не ровный угол увеличит ширину и высоту фото: Зеркальное отражениеImageflip() зеркалит изображение, могут быть следующие параметры:
Наложение водяного знака (watermark)Для защиты на картинки наносят копирайт, например, данный скрип накладывает картинку watermark.png на основное изображение: Результат
Добавление фонаАктуально для PNG с прозрачностью. Скрипт вставит на задний фон картинку с положением $x и $y . Размер основного изображения не изменится.
ФильтрыФункция imagefilter() применяет фильтр к изображению. IMG_FILTER_NEGATEИнвертирует цвета изображения. IMG_FILTER_GRAYSCALEПреобразует цвета изображения в градации серого. IMG_FILTER_COLORIZEПреобразует цвета изображения в градации заданного цвета в формате RGB.
IMG_FILTER_BRIGHTNESSИзменяет яркость изображения, диапазон от -255 до 255.
IMG_FILTER_CONTRASTИзменяет контрастность изображения. Уровень может быть от -100 до 100.
IMG_FILTER_EDGEDETECTИспользует определение границ для их подсветки. Можно ли вывести превью загружаемой картинки?Можно как то вывести превью загружаемой картинки ? Миниатюру, где красный квадра. 1 ответ 1Форма отправки у вас уже есть. Я приведу свой скрипт который использую(не поню где его нашел), правда для него, вам надо подключить jquery. Всё ещё ищете ответ? Посмотрите другие вопросы с метками php изображения upload или задайте свой вопрос.ПохожиеПодписаться на лентуДля подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS. дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.11.35402 KREMER.PRO | БлогЗаметки front-end программистаСоздание превьюшек в PHPСоздать экскиз-превью по изображению в PHP – задача тривиальная, необходимо только воспользоваться встроенными функциями imagecopyresampled() и imagejpeg() . Однако есть две вещи, которые хочется улучшить в этом процессе:
Очень просто всё сделать становится с помощью этого класса: Превью картинки на PHPЗдесь могла бы быть ваша реклама Покинул форум Секрет Само собой я знаю что ответят мне тут же, и если я посмотрю После этого приходится начинать уточнять этим неграмотным что мне надо. Уверен что если бы я им сказал что у меня есть Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме: На последок как оно происходит на форумах Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался! Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12 Миниатюры на PHPСтатья написана для интернет-издания Hostinfo.ru. В ходе разработки и обслуживания сайтов часто возникает необходимость в создании миниатюр — уменьшенных копий изображений. В тексте страницы вместо большой картинки можно поместить такую копию, являющуюся ссылкой на исходный файл. Работа фотоальбомов и галерей изображений, менеджеров файлов в CMS немыслима без автоматического создания миниатюр. Мы разберем скрипт, генерирующий подобные миниатюры, и на его примере познакомимся с некоторыми возможностями PHP для работы с изображениями. PHP обрабатывает изображения с помощью библиотеки GD. Почти на всех хостинговых площадках эта библиотека установлена. Если вдруг вам не повезло, обратитесь в техническую поддержку вашего хостинга. В нашем скрипте будем использовать функции, появившиеся в библиотеке GD версии 2.0.1. Сначала определим требования, которым будет отвечать генератор миниатюр. Он должен создавать уменьшенные копии изображений, сохраненных в форматах GIF, JPEG и PNG. Если исходное изображение обладало прозрачностью, то и миниатюра должна сохранять прозрачность. Также не следует пренебрегать безопасностью и быстродействием. Мы определились с тем, чего хотим. Теперь можно приступать к программированию. Исходный файл и размеры конечной картинки будем передавать через URL: Для указания размера миниатюры предусмотрим два способа. Можно задать параметр max_size , тогда размеры изображения на выходе будут пропорциональны исходным, но изменятся так, что его можно будет вписать в квадрат размером max_size*max_size . Можно также задавать размер изображения на выходе напрямую в параметрах width и height (при отсутствии одного из них картинка будет сжата пропорционально). Договоримся, что скрипт будет генерировать миниатюры для файлов, расположенных в корневой директории веб-сервера или в поддиректориях. Для предотвращения несанкционированного доступа к другим файлам условимся, что параметр file в URL задает путь к файлу от корневой директории и начинается со знака ‘/’ . Рассмотрим функцию, которая будет выполнять основную задачу скрипта. Для начала получим информацию об исходном изображении: Функция getimagesize возвращает массив $image_info , содержащий значения некоторых характеристик изображения:
В зависимости от mime-типа мы будем вызывать свою функцию для открытия и загрузки изображения: imagecreatefromGIF , imagecreatefromJPEG или imagecreatefromPNG . Теперь нужно определить размеры миниатюры, если они не заданы явно. Функция imagecreatetruecolor создает полноцветное изображение указанного в параметрах размера и возвращает его идентификатор. imagealphablending позволяет выбрать один из двух способов работы с альфа-каналом. Если второй параметр этой функции установлен в true, то при рисовании полупрозрачным цветом новое изображение частично накладывается на старое. Если же он установлен в false, то происходит полное замещение пикселей исходного изображения на пиксели нового. Ясно, что нам нужен именно второй режим. Функция imagesavealpha необходима для того, чтобы при вызове функции imagePNG альфа-канал был сохранен в результирующее изображение. Теперь настало время вызвать функцию, которая и выполнит основную задачу этого скрипта. imagecopyresampled копирует прямоугольную область из первого изображения во второе. Она принимает на вход идентификаторы изображений, координаты верхнего левого угла области во втором изображении, координаты верхнего левого угла области в первом изображении, ширину и высоту области во втором изображении и ширину и высоту области во первом. Если размеры областей различны, копируемое изображение растягивается или сжимается. При этом применяется сглаживание, так что качество картинки остается удовлетворительным. Следует отметить, что есть и другая функция, imagecopyresized , которая похожа на imagecopyresampled . Качество картинки, созданной imagecopyresized , трудно признать удовлетворительным, поскольку эта функция не производит сглаживание, но она работает быстрее. Поэтому в некоторых ситуациях вполне допустимо ее использовать. Так как мы хотим сохранить прозрачность исходного изображения, миниатюру приходится сохранять в формате PNG. Функция imagePNG выводит в браузер изображение с указанным идентификатором. На этом работу над скриптом можно было бы завершить. Действительно, собрав вышеприведенный код в один файл (при этом текст функции необходимо поместить в самом начале) и разместив в конце операторы мы получим работоспособный скрипт. Следует отметить, что функция header устанавливает заголовки ответа сервера, и в данном случае она указывает на тип (картинка PNG) возвращаемых данных. Заголовок Content-Type , как и любые заголовки, необходимо устанавливать до операций вывода. Однако при работе с графикой устанавливать этот заголовок нужно как можно ниже, так как сообщения об ошибках, появляющихся после установки Content-Type: image/png не будут выводиться в браузер. Посмотрим на написанный код. Каждый раз при обращении к странице с миниатюрами сервер создает их заново, что при большой посещаемости сайта приведет к значительной нагрузке на сервер. Обычным выходом в данной ситуации является кеширование — сохранение результатов работы скрипта в файлы. Кеширование динамической информации имеет смысл, если она обновляется существенно реже, чем происходят обращения к странице, на которой она отображается. Есть ситуации, когда не нужно кешировать картинку, генерируемую налету. Например, счетчик посещений, который для каждой загрузки страницы должен показывать, очевидно, разные значения. Однако в большинстве случаев изображения, для которых создаются миниатюры, изменяются сравнительно редко, в таких случаях кеширование оправдано. Рассмотрим, как можно сделать кеширование миниатюр. Мы будем сохранять их в файлы с именами, являющимися md5-хешами имен файлов с исходными изображениями, например, в папку img_cache в корневой директории веб-сервера. Определим время изменения файла с кешем, если он существует. Сравним время изменения исходного файла с изображением и время изменения файла в кеше. Если изображение менялось после попадания миниатюры в кеш, создается новая миниатюра и обновляется кеш. Если же изображение не менялось, мы просто используем копию миниатюры из кеша. Таким образом, кеш будет поддерживаться в актуальном состоянии. Наша функция make_thumbnail сразу отправляет миниатюру браузеру. Однако предварительно нужно сохранить миниатюру в кеш. Поэтому мы не должны вызывать функцию make_thumbnail непосредственно, так, как сделали это выше. Нужно перехватить вывод с помощью буферизации. После выполнения участка кода между ob_start и ob_end_clean в переменной $thumbnail будут содержаться те данные, которые функция imagePNG собиралась отправить браузеру, а в переменной $thumb_size — размер данных. Стоит отметить, что в директории img_cache будут оставаться уменьшенные копии удаленных картинок. Поэтому при масштабном изменении структуры сайта кеш нужно очищать вручную. Осталось установить заголовки и отправить миниатюру браузеру. Теперь нужно собрать участки кода в один файл, например, preview.php (разместив функцию make_thumbnail в начале) и поместить его в корневую директорию веб-сервера. Там же нужно создать директорию img_cache и установить права доступа к ней в 777. Всё готово! Пусть изображение pict.jpg лежит в директории images, то есть его можно вставить на страницу с помощью кода . Тогда код, помещающий миниатюру, примет вид . Разумеется, в этом скрипте можно реализовать и другие возможности. В статье была заложена основа, а остальное зависит от вашей фантазии. Превью картинки на PHPДанный класс позволяет на лету: Для того чтобы запустить изменение размера необходимо в файле .htaccess прописать Где d_docsm/create.php путь к изображению меняющему размер //reference thumbnail class //$thumb = new Thumbnail(‘../albums/’ . $albumName . ‘/’ . $fileName); файлы thumbnail.inc.php, create.php и папка thumbs должны лежать в одной директории. Файлы Thumbs.rar ( 4,77 KB ) Кол-во скачиваний: 53 Источник неизвестен Отредактировано: ralfNV — 7 Марта 2010, 13:43 Возраст: скрывает Email: lev_92.23@mail.ru · Skype: Lev_Veron · Email: support@cyberstyle.kz Искал урок но не нашел. Пишу сюда, сильно не браните, если не по теме! Тема така. У мну есть массив. Он состоит из трех полей: адрес к картинке, название к картинке, и id. Массив имеет неогранниченное количество картинок! Вопрос. Как прописать PHP, чтоб программа выводила все картинки с названием из массива по 4е шт. в строке. Т.е. имеет место цикл, о выводе всех картинок, но через каждую 4, 8, 12, 16, 20 и т.д. картинку необходимо выводить тег Вроде легко, но из-за не знания многих операторов PHP не могу выполнить данную задачку. Помогите плз. Осень надобно. Сайт закончил уже, даже админку, но из-за етого не могу полностью завершить все! Работа с изображениями на PHPУважаемые участники проекта ДвижКод! Сегодня вас ждёт еще одна интересная тема. Все мы привыкли, скажем, загружать новые аватарки в социальных сетях. Но как они масштабируются до нужных размеров? Что происходит на сервере? На эти и многие другие вопросы ответы вас ждут под катом. Да, если кто не в курсе, то в интернет-терминологии «кат» (от англ. cut — резать), это место, которое разделяет новость на краткое (в общем списке) и полное представления. Многие знают, что я разрабатываю собственную систему управления сайтами под названием Когир (Cogear, http://cogear.ru). История сложная и длинная, но упорно иду к поставленной цели. Недавно мне пришлось переписывать ранее написанные классы для работы с изображениями, поэтому я решил с вами поделиться тем, как всё это делается. Милости прошу на кухню. Давайте посмотрим базовые аспекты работы с изображениями. В PHP есть встроенная библиотека GD. Вот её документация: На этой странице вы найдете огромное количество самых разных функций. Но не пугайтесь. Нас интересуют вполне конкретные. Как видите, работа с изображениями пока что происходит в виде процедур (функций), поэтому объектно-ориентированную оболочку приходится писать самому. Простейший пример работы с изображением: Пробуем на локальной машине. Создаём файл image.php(у меня для экспериментов локальный домен test.local). Кладём в корень папки сайта test.local картинку 1.jpg: Вызываем в браузере http://test.local/image.php (в вашем случае — другой адрес). Обнаруживаем в папке картинку 2.jpg: Пропорции не сохранились, как видите. Потому что мы их не пересчитали. Исправим наш скрипт так, чтобы происходил пересчёт: Посмотрим на результат: Поскольку мы пересчитывали по высоте, то часть конечного изображения оказалась черной (изначальный цвет созданного полотна). Что еще можно делать с изображением? Подрезать его, поворачивать, наслаивать одно на другое, рисовать на нём. Уверен, что вам будет интересен мой класс для работы с изображениями. Он вне системы не работает, так как является драйвером для шестерёнки (модуля) «Изображения». Но вы найдете в нём для себя много интересного: Как он работает в системе? Ради чего столько кода? Понимаете? Работает со всеми нужными форматами автоматически. Функционал при необходимости можно расширять. Домашним заданием для вам будет проделать то, что указано выше (до моего класса) на локальной машине. При желании и времени поэкспериментировать с параметрами. ПоделитьсяКомментарии Правила дискуссии
Если вы не соблюдаете эти три простых правила, то ваши комментарии удаляются без предупреждения. Во всем остальном вам предоставляется полная свобода слова и выражения собственного мнения. Превью картинки на PHPСозданные страницы должны выводиться плиткой, с показом картинки от видео, причем, со своего сервера — чтобы не ждать ответа от удалённого. Задача осложняется тем, что существует минимум 8 вариантов указания ссылок на эти 3 сервиса: Это всё ссылки на один и тот же клип Rammstein — Mein Herz brennt (Piano Version). Не стоит забывать еще и про юзеров, которые обязательно вставят в форму «ссылку для блога», то есть — прям тег iframe со всеми свойствами, который отдаст сервис. Вот исходный код моего класса, пользуйтесь на здоровье. Он абсолютно самодостаточен и не завязан на MODX, требуется только cUrl. В ответ приходит массив содержащий или ключ error с ошибкой, или ключи со ссылками image и video. Если картинку достать не получается — будет подставлен дефолтный url. Все ссылки на видео-хостинги приводятся к единому виду. Обращаю ваше внимание на то, что превью-картинки сохраняются на сервер, то есть достаются ровно один раз, затем можно использовать их как угодно. При инициализации класса можно указать пути для работы. Пример использования: Отправите ссылку через $_GET и в ответ получите массив с результатом и картинку в указанной директории. Обновлено 17.08.13
Комментарии ( )Вот варианты ссылок, которые я нашел для YouTube. Регулярка простая: Но у меня по проекту условие, что один урл в одной строке, поэтому где-то может не работать.
Не понятно, что делает этот сниппет? Зачем он и выставляет плейсхолдеры, и возвращает url картинки\видео? У меня, например, через форму отправлялся урл, для него получалась картинка и сохранялась на сервер, записывая свой адрес в ТВ ресурса. Ну а потом уже обычный вывод страниц, через getResources, с этими картинками. А тут какая задача? У меня задача: есть раздел с мастерклассами, они в частности состоят из видео и тестового описания. Т.е. надо выводить видео с ютубы на самой странице и картинку в анонсе, для завлекухи. Выходит, у тебя каждый раз запускается сниппет, обрабатывает ссылку и потом клиент тянет картинку с youtube? При том, что сниппет, на самом деле, сохраняет эти картинки на твой сервер. В общем, я бы добавил ТВ studioImage и переделал так: Пишем сниппет, getImage: Таким образом, класс videoThumb инициализируется только раз и сниппет запускается только на те записи, у которых нет ТВ с картинкой. Ну а картинки потом получаются с твоего сервера. Так быстрее и логичнее. Писал в браузере, не проверял — могут быть опечатки. |