Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Программное уменьшения размера и качества изображения.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
bt_corp
Отправлено: 15 Сентября, 2010 - 19:04:14
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




И так я долго искал способ уменьшить размер изображения не клонируя его и не сохраняя на сервере.

Наконец нашел решения. Радость
И решил поделиться с вами, может кому пригодится.

Создайте файл thumbnail.php

С данным содержанием:

И положите его в корневую папку вашего сайта.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. function ErrorImage ($text) {
  5. global $maxw;
  6. $len = strlen ($text);
  7. if ($maxw < 154) $errw = 154;
  8. $errh = 30;
  9. $chrlen = intval (5.9 * $len);
  10. $offset = intval (($errw - $chrlen) / 2);
  11. $im = imagecreate ($errw, $errh); /* Create a blank image */
  12. $bgc = imagecolorallocate ($im, 153, 63, 63);
  13. $tc = imagecolorallocate ($im, 255, 255, 255);
  14. imagefilledrectangle ($im, 0, 0, $errw, $errh, $bgc);
  15. imagestring ($im, 2, $offset, 7, $text, $tc);
  16. header ("Content-type: image/jpeg");
  17. imagejpeg ($im);
  18. }
  19.  
  20. function thumbnail ($gdver, $src, $maxw=190) {
  21.  
  22. $gdarr = array (1,2);
  23. for ($i=0; $i<count($gdarr); $i++) {
  24. if ($gdver != $gdarr[$i]) $test.="|";
  25. }
  26. $exp = explode ("|", $test);
  27. if (count ($exp) == 3) {
  28. ErrorImage ("Incorrect GD version!");
  29. }
  30.  
  31. if (!function_exists ("imagecreate") || !function_exists ("imagecreatetruecolor")) {
  32. ErrorImage ("No image create functions!");
  33. }
  34.  
  35. $size = @getimagesize ($src);
  36. if (!$size) {
  37. ErrorImage ("Image File Not Found!");
  38. } else {
  39.  
  40. if ($size[0] > $maxw) {
  41. $newx = intval ($maxw);
  42. $newy = intval ($size[1] * ($maxw / $size[0]));
  43. } else {
  44. $newx = $size[0];
  45. $newy = $size[1];
  46. }
  47.  
  48. if ($gdver == 1) {
  49. $destimg = imagecreate ($newx, $newy );
  50. } else {
  51. $destimg = @imagecreatetruecolor ($newx, $newy ) or die (ErrorImage ("Cannot use GD2 here!"));
  52. }
  53.  
  54. if ($size[2] == 1) {
  55. if (!function_exists ("imagecreatefromgif")) {
  56. ErrorImage ("Cannot Handle GIF Format!");
  57. } else {
  58. $sourceimg = imagecreatefromgif ($src);
  59.  
  60. if ($gdver == 1)
  61. imagecopyresized ($destimg, $sourceimg, 0,0,0,0, $newx, $newy, $size[0], $size[1]);
  62. else
  63. @imagecopyresampled ($destimg, $sourceimg, 0,0,0,0, $newx, $newy, $size[0], $size[1]) or die (ErrorImage ("Cannot use GD2 here!"));
  64.  
  65. header ("content-type: image/gif");
  66. imagegif ($destimg);
  67. }
  68. }
  69. elseif ($size[2]==2) {
  70. $sourceimg = imagecreatefromjpeg ($src);
  71.  
  72. if ($gdver == 1)
  73. imagecopyresized ($destimg, $sourceimg, 0,0,0,0, $newx, $newy, $size[0], $size[1]);
  74. else
  75. @imagecopyresampled ($destimg, $sourceimg, 0,0,0,0, $newx, $newy, $size[0], $size[1]) or die (ErrorImage ("Cannot use GD2 here!"));
  76.  
  77. header ("content-type: image/jpeg");
  78. imagejpeg ($destimg);
  79. }
  80. elseif ($size[2] == 3) {
  81. $sourceimg = imagecreatefrompng ($src);
  82.  
  83. if ($gdver == 1)
  84. imagecopyresized ($destimg, $sourceimg, 0,0,0,0, $newx, $newy, $size[0], $size[1]);
  85. else
  86. @imagecopyresampled ($destimg, $sourceimg, 0,0,0,0, $newx, $newy, $size[0], $size[1]) or die (ErrorImage ("Cannot use GD2 here!"));
  87.  
  88. header ("content-type: image/png");
  89. imagepng ($destimg);
  90. }
  91. else {
  92. ErrorImage ("Image Type Not Handled!");
  93. }
  94. }
  95.  
  96. imagedestroy ($destimg);
  97. imagedestroy ($sourceimg);
  98. }
  99.  
  100. thumbnail ($_GET["gd"], $_GET["src"], $_GET["maxw"]);
  101. ?>
  102.  


Теперь чтобы использовать его надо обращаться к этому файлу. Через $ _GET запрос. Т.е. так http://ВашСайт[dot]ru/thumbnail.php?gd=2&src=Имя папки/Название изображения.jpg&maxw=300

maxw = 300 это максимальное расширение изображения в px в которое оно скомпилюеться.

В результате получится нечто похожее на это http://bigtorrent-ua[dot]com/thumbna[dot][dot][dot]png&maxw=200

Оригинал: http://bigtorrent-ua[dot]com/bigtorrent-ua[dot]com[dot]png

Может кому пригодится Радость


-----
Программист, это - такой человек, который сначала много думает, чтобы потом ничего не делать!
 
 Top
cHameleon
Отправлено: 15 Сентября, 2010 - 19:44:38
Post Id



Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




когда я впервые писал галерейку, я использовал подобный метод) каждый раз картинки ресайзились по новой. бедный сервер, он наверное меня материл. а еще я забыл сделать ограничение по разрешению картинок и один раз в галерею загрузили картинку 16к на 16к. ресайзилась картинка в 100на100 Закатив глазки
с тех пор я стараюсь учесть все ньюансы, а этот метод больше не использую (тут как говорится, дело вкуса)

bt_corp пишет:
maxw = 300 это максимальное расширение изображения в px в которое оно скомпилюеться.

наверное имелось ввиду разрешение


-----
берём notepad++ и творим пэхэпэ-мир
 
 Top
volkodav
Отправлено: 15 Сентября, 2010 - 19:50:50
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




Мне надо) cHameleon А какой метод ты используешь?
 
 Top
Uchkuma
Отправлено: 15 Сентября, 2010 - 20:21:26
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




cHameleon пишет:
наверное имелось ввиду разрешение
Ну вообще-то просто размер. У картинки, отображаемой на мониторе не может быть разрешения, ибо разрешение - это количество точек на единицу длины.
volkodav пишет:
Мне надо) cHameleon А какой метод ты используешь?
Чтобы картинки не ресайзились каждый раз их можно кешировать. Т.е. сохранять на диск их уменьшенную копию.
 
 Top
JustUserR
Отправлено: 16 Сентября, 2010 - 15:29:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




bt_corp пишет:
И так я долго искал способ уменьшить размер изображения не клонируя его и не сохраняя на сервере.
Созданный вами PHP-скрипт для генерации уменьшеньшенной копии изображений по первичному запросу в его текущей реализации является небезопасным для сервера - дело в том что путем автоматической отправки массового числа запросов на одно и то же изображения можно призвести атаку типа отказ от доступа из-за перенагрузки - в то время как наличие кеширования и сохранение копии файла уменьшенного изображения на диск существенно уменьшает эту возможность


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
bt_corp
Отправлено: 16 Сентября, 2010 - 17:49:33
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




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

(Отредактировано автором: 16 Сентября, 2010 - 17:50:26)



-----
Программист, это - такой человек, который сначала много думает, чтобы потом ничего не делать!
 
 Top
JustUserR
Отправлено: 17 Сентября, 2010 - 13:13:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




bt_corp пишет:
JustUserR если вам не трудно то реализуйте кэширования уменьшенных копий на сервер. Я не знаю как это сделать
Реализация кеширования для системы генерации уменьшенных копий изображений зависит от структуры согласно которой происходит обращение к исходным файлам - в частности это может быть уникальный номер изображения в БД или файловый путь который соответствует виртуальному web-пути без alias-ов и действенных перенаправлений В таком случае PHP-скрипт работает следующим образом - он получвает определенный идентификатор исходного изображения и преобразует его согласно выбранным правилам - после чего проверяет наличие аналогичного имени в папке с кешированными изображениями - и в зависимости от его существования выполняет генерацию нового изображения или показ старого Кроме того желательно организовать дополнитльную проверку такого аттрибута файла исходного изображения как время его последней модификации - в таком случае можно определить что оно изменилось и необходимо произвести генерацию новой миниатюры


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB