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
Форумы портала PHP.SU :: Версия для печати :: Прорисовка картинки из памяти
Форумы портала PHP.SU » » Графика в PHP » Прорисовка картинки из памяти

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

1. Dgrad - 01 Октября, 2013 - 17:50:24 - перейти к сообщению
Есть скрипт который содержит функцию (resize.php):
PHP:
скопировать код в буфер обмена
  1. //$filename содержит путь и имя файла
  2. function resize_foto ($filename){
  3.     $size_foto = getimagesize($filename);
  4.     $width_small_foto = 100; //ширина выводимой уменьшенной копии
  5.     $ratio = $size_foto[0]/$width_small_foto; //коэффициент уменьшения
  6.     $x = $size_foto[0]/$ratio; //ширина копии =100
  7.     $y = $size_foto[1]/$ratio; //высота копии
  8.     $rectangle = imagecreatetruecolor($x, $y);
  9.     $smallfoto = imagecreatefromjpeg($filename);
  10.     imagecopyresampled($rectangle,
  11.                        $smallfoto,
  12.                        0, 0,
  13.                        0, 0,
  14.                        $x, $y,
  15.                        $size_foto[0],
  16.                        $size_foto[1]);
  17.    
  18.    header("Content-type: image/jpeg");
  19.    return imagejpeg($rectangle, '', 100);
  20.    imagedestroy($rectangle);
  21.    }
  22.    resize_foto($filename);

и к примеру есть код html (view.php):
CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <body>
  3. <img src="resize.php"/>
  4. </body>
  5. </html>

Если объявить переменную $filename (например 'image/file.jpg') скрипт view.php спокойно выводит уменьшенную копию изображения без сохранения файла. Я столкнулся с проблемой поскольку не особо силен в тонкостях PHP. Проблема следующая:
В будущем в базе данных mysql в отдельной таблице будут содержаться данные о фото (все те же 'image/file.jpg') и выводится они будут по такому же принципу как и в скрипе view.php Подскажите пожалуйста как организовать такой вывод нескольких изображений. Пока в мысли пришло следующее но увы не работает:
PHP:
скопировать код в буфер обмена
  1. //получаем данные о фотках (image/filename1.jpg, image/filename2.jpg и т.д.)
  2. ........
  3. while($row = mysqli_fetch_assoc($result)){
  4.     echo '<img src="resize.php?filename='.$row['filename'].'"><br/>';
  5. }

или же может вызывать функцию с дополнительным параметром но тогда header генерирует ошибку.
Может как то можно через $_GET() передать данные из view.php в resize.php и выводить картинки в памяти не сохраняя их? А то в будущем планируется много фоток поэтому и хочу выводить их в уменьшенном варианте... Главное принцип дальше разберусь... Нужно чтоб переменная объявлялась в view.php а выводилась через resize.php

Заранее спасибо...
(Добавление)
С эти вопросом разобрался следующим образом. Если не создавать функцию resize а просто оставить скрипт в файле то именно таким методом все это и работает. Остался вопрос. можно ли каким то образом передавать функцию или вызывать ее в теге <img> или в значении src?
2. philin - 01 Октября, 2013 - 22:35:39 - перейти к сообщению
Передавать функцию - в смысле в файле иметь несколько функций для внешнего обращения? Тогда нужен простой роутер на свичах
CODE (html):
скопировать код в буфер обмена
  1. <img src="resize.php?action=resize&filename=1.png">

PHP:
скопировать код в буфер обмена
  1.  
  2. switch ($_GET['action']){
  3. case:'resize'
  4.   resize($_GET['filename']);
  5.   break;
  6. case:'another'
  7.   do_another();
  8.   break;
  9. }
  10.  


Если же речь идет о вызове функции resize() из view.php, т.е., при создании страницы генерировать превью и отдавать в браузер уже все готовое, то поможет require_once('resize.php') и base64_encode(), но это не слишком удачный вариант (кодирование займет время да и объем данных возрастет).

Советую все же хранить превью картинок. Каждый раз при обращении генерировать - возможна большая нагрузка на ЦП даже при небольшом количестве обращений. Обработка графики весьма затратна.

P.S. return возвращает указанное значение и прекращает работу функции. imagejpeg() сам по себе выводит данные, а imagedestroy($rectangle) никогда не будет вызван из-за return строкой выше.
3. Dgrad - 02 Октября, 2013 - 18:14:59 - перейти к сообщению
Спасибо за комментарий. Учту в дальнейшем. А можно поинтересоваться. Насколько сильно загрузит память вывод изображений через браузер без их сохранения. Например если на странице 10-12 "превьюшек" такого типа и не более??? Может при таком количестве загрузка незначительна???
4. Мелкий - 02 Октября, 2013 - 19:02:01 - перейти к сообщению
Нагрузка заметна от одной превьюшки.
Несколько десятков - положат мелкий хостинг как нефиг делать.

 

Powered by ExBB FM 1.0 RC1