Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функция масштабирования изображения. Вывод в браузер
 
 автор: yura_040   (18.12.2009 в 14:01)   письмо автору
 
 

Добрый день!
Есть на сервере изображение размером например 1000px на 800px (photo1.jpg)
(пусть все изображения лежат в папке: img/photo1.jpg)

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

Ниже приведена функция которая должна это выполнять, но что-то у меня не получается вывести изображение в браузер.

А как вывести изображение в браузер, если обращение к функции происходит уже после вывода текста на странице.

Пробовал

echo "<img src='".("img/photo1.jpg", 100, 100)."'>";


но ничего ((
Может кто сталкивался с такой проблемой ?

function resizeimg($filename, $w, $h)
{
    $ratio = $w/$h;
    $size_img = getimagesize($filename);
    if(($size_img[0]<$w) && ($size_img[1]<$h)) return true;
    $src_ratio = $size_img[0]/$size_img[1];
    if($ratio<$src_ratio) $h = $w/$src_ratio;
    else $w = $h*$src_ratio;
    $dest_img = imagecreatetruecolor($w, $h);
    if($size_img[2] == 2) $src_img = imagecreatefromjpeg($filename);
    else if ($size_img[2] == 1) $src_img = imagecreatefromgif($filename);
    else if ($size_img[2] == 3) $src_img = imagecreatefrompng($filename);
    if (!imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1])) return false;
    $path_parts = pathinfo($filename);
    if($path_parts["extention"] == "jpg")
    {
        header("Content-type: image/jpeg");
        imagejpeg($dest_img);
    }
    else if($path_parts["extention"] == "gif")
    {
        header("Content-type: image/gif");
        imagejpeg($dest_img);
    }
    else if($path_parts["extention"] == "png")
    {
        header("Content-type: image/png");
        imagejpeg($dest_img);
    }
    imagedestroy($dest_img);
    imagedestroy($src_img);
    return true;
}

  Ответить  
 
 автор: Саня   (18.12.2009 в 14:06)   письмо автору
 
   для: yura_040   (18.12.2009 в 14:01)
 

Вы забыли вызвать функцию. А вообще эту функцию нужно в отдельный файл вынести и обращаться к нему.

<img src="resize.php?name=<?=$filename?>">

<? // код файла resize.php
function resizeimg($filename$w$h

  
// ...
  // тело функции
  // ...
}
if ( isset(
$_GET['name']) && file_exists($_GET['name']) )
  
resizeimg($_GET['name'], 100100);


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

  Ответить  
 
 автор: sim5   (18.12.2009 в 14:24)   письмо автору
 
   для: Саня   (18.12.2009 в 14:06)
 

А еще лучше готовить их при загрузке оригинала на сервер.

  Ответить  
 
 автор: yura_040   (18.12.2009 в 15:27)   письмо автору
 
   для: sim5   (18.12.2009 в 14:24)
 

Да дело в том, что уже сайт был сделан кем-то и сейчас превьюшки выводятся просто в теге img указана ширина 200px и получается, что на странице 40 картинок и они все пока загрузятся ... (т.к. оригинальная ширина и высота изображения другая 800, 1000 1500px и т.д.) долго очень, а позиций в базе 900...

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

  Ответить  
 
 автор: Trianon   (18.12.2009 в 15:37)   письмо автору
 
   для: yura_040   (18.12.2009 в 15:27)
 

их можно сохранять и на лету. Хотя лучше, конечно, сделать всё заранее.
А при обращении браузера, сервер может перенаправить последний на статический файл, предварительно его создав.

Факт тот, что закачивать картинки постоянно в любом случае не нужно.

  Ответить  
 
 автор: sim5   (18.12.2009 в 15:38)   письмо автору
 
   для: yura_040   (18.12.2009 в 15:27)
 

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

  Ответить  
 
 автор: yura_040   (18.12.2009 в 15:49)   письмо автору
 
   для: sim5   (18.12.2009 в 15:38)
 

Вы правы. Я так и сделаю напишу временный скрипт, потом меньше проблем будет.

  Ответить  
 
 автор: yura_040   (18.12.2009 в 15:38)   письмо автору
 
   для: Саня   (18.12.2009 в 14:06)
 

Александр я совсем не увидел, когда писал , что опустил название функции. Я конечно к ней обращался, а вот

<img src="resize.php?name=<?=$filename?>">
за это спасибо ))

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


<img src="resize.php?name=<?=$filename?>">


Я поместил функцию в отдельный файл resize.php


// содержимое resize.php

function resizeimg($filename, $w, $h)
{
    $ratio = $w/$h;
    $size_img = getimagesize($filename);
    if(($size_img[0]<$w) && ($size_img[1]<$h)) return true;
    $src_ratio = $size_img[0]/$size_img[1];
    if($ratio<$src_ratio) $h = $w/$src_ratio;
    else $w = $h*$src_ratio;
    $dest_img = imagecreatetruecolor($w, $h);
    if($size_img[2] == 2) $src_img = imagecreatefromjpeg($filename);
    else if ($size_img[2] == 1) $src_img = imagecreatefromgif($filename);
    else if ($size_img[2] == 3) $src_img = imagecreatefrompng($filename);
    if (!imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1])) return false;
    $path_parts = pathinfo($filename);
    if($path_parts["extention"] == "jpg")
    {
        header("Content-type: image/jpeg");
        imagejpeg($dest_img);
    }
    else if($path_parts["extention"] == "gif")
    {
        header("Content-type: image/gif");
        imagejpeg($dest_img);
    }
    else if($path_parts["extention"] == "png")
    {
        header("Content-type: image/png");
        imagejpeg($dest_img);
    }
    imagedestroy($dest_img);
    imagedestroy($src_img);
    return true;


if ( isset($_GET['name']) && file_exists($_GET['name']) )
  resizeimg($_GET['name'], 100, 100); 



<img src="resize.php?name=img1.jpg">


Может кто-нибудь проверит эту функцию у себя? Чтобы знать работоспособная функция или где-то я ошибаюсь....

  Ответить  
 
 автор: neadekvat   (18.12.2009 в 15:55)   письмо автору
 
   для: yura_040   (18.12.2009 в 15:38)
 

У вас картинка находится в одной директории с resize.php, а файл, вызывающий resize.php, также в этом каталоге? Не верится что-то. С адресами файлов вы ошиблись, мне кажется.

  Ответить  
 
 автор: yura_040   (18.12.2009 в 16:03)   письмо автору
 
   для: neadekvat   (18.12.2009 в 15:55)
 

Вот так обращаюсь.... тоже ничего:
<img src="resize.php?name=images/img1.jpg"> 

  Ответить  
 
 автор: Саня   (18.12.2009 в 16:13)   письмо автору
 
   для: yura_040   (18.12.2009 в 16:03)
 

Используйте абсолютные пути.

  Ответить  
 
 автор: neadekvat   (18.12.2009 в 16:17)   письмо автору
 
   для: yura_040   (18.12.2009 в 16:03)
 

> Используйте абсолютные пути.
И не через аргумент src их передавайте, а подставляйте в заготвленный адрес в функции:
<img src="resize.php?name=img1.jpg">

$src = '/images/' . $filename;

  Ответить  
 
 автор: yura_040   (18.12.2009 в 16:33)   письмо автору
 
   для: neadekvat   (18.12.2009 в 16:17)
 

Не работает что-то и с абсолютными путями ( и в адрес функции подставляю путь с картинкой тоже не работает.)
Ладно все равно уже другим способом решаю задачу.

Всем спасибо за участие в обсуждении ))

  Ответить  
 
 автор: yura_040   (18.12.2009 в 15:39)   письмо автору
 
   для: Саня   (18.12.2009 в 14:06)
 

Александр я совсем не увидел, когда писал , что опустил название функции. Я конечно к ней обращался, а вот

<img src="resize.php?name=<?=$filename?>">
за это спасибо ))

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


<img src="resize.php?name=<?=$filename?>">


Я поместил функцию в отдельный файл resize.php


// содержимое resize.php

function resizeimg($filename, $w, $h)
{
    $ratio = $w/$h;
    $size_img = getimagesize($filename);
    if(($size_img[0]<$w) && ($size_img[1]<$h)) return true;
    $src_ratio = $size_img[0]/$size_img[1];
    if($ratio<$src_ratio) $h = $w/$src_ratio;
    else $w = $h*$src_ratio;
    $dest_img = imagecreatetruecolor($w, $h);
    if($size_img[2] == 2) $src_img = imagecreatefromjpeg($filename);
    else if ($size_img[2] == 1) $src_img = imagecreatefromgif($filename);
    else if ($size_img[2] == 3) $src_img = imagecreatefrompng($filename);
    if (!imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1])) return false;
    $path_parts = pathinfo($filename);
    if($path_parts["extention"] == "jpg")
    {
        header("Content-type: image/jpeg");
        imagejpeg($dest_img);
    }
    else if($path_parts["extention"] == "gif")
    {
        header("Content-type: image/gif");
        imagejpeg($dest_img);
    }
    else if($path_parts["extention"] == "png")
    {
        header("Content-type: image/png");
        imagejpeg($dest_img);
    }
    imagedestroy($dest_img);
    imagedestroy($src_img);
    return true;


if ( isset($_GET['name']) && file_exists($_GET['name']) )
  resizeimg($_GET['name'], 100, 100); 



<img src="resize.php?name=img1.jpg">


Может кто-нибудь проверит эту функцию у себя? Чтобы знать работоспособная функция или где-то я ошибаюсь....

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования