PDA

Просмотр полной версии : Как сжать на сервере и вывести image средствами Php?


PEPSICOLA
17.01.2007, 01:57
Вообщем сабж :) Допустим у меня на сайт есть картинки разного разрешения, в формате Jpg. Это на случай если кто нажмёт "download original file", а как для preview хотелось бы что бы все картинки одинаково выводились размером 600x440 А ещё лучше сжимались в ширине до 600 пропорционально высоте, как уж выйдет.

Помню что должна быть какая то поддержка со стороны сервера. Но вообщем, как это назвать и где бы поискать? Саму процедуру обработки image'ов =)

Большое спасибо!

nc.STRIEM
17.01.2007, 02:00
вобще рекомендую сделать отдельную папку с уже готовыми превюшками, так как их сжатие будет занимать не мало времени!

а вот собсна и функция для сжатия:

/************************************************** *********************************
Функция img_resize("имя исходного файла", " имя генерируемого файла", " ширина ", "высота" ," качество генерируемого JPEG, по умолчанию - максимальное ","цвет фона, по умолчанию - белый")
************************************************** *********************************/

function img_resize($src, $dest, $width, $height, $quality=100, $rgb=0xFFFFFF)
{
if (!file_exists($src)) return false;

$size = getimagesize($src);

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

// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) return false;

$x_ratio = $width / $size[0];
$y_ratio = $height / $size[1];

$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);

$new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);


$isrc = $icfunc($src);
$idest = imagecreatetruecolor($new_width, $new_height);

imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);

for($i=strlen($dest)-1;$i>=0;$i--)
if($dest[$i]=='.')
break;
$i++;
$ftypeg="";
while($i<strlen($dest))
{
$ftypeg.=$dest[$i];
$i++;
}
if(strtolower($ftypeg)=="jpg")
$ftypeg="jpeg";
$ftypeg="image".$ftypeg;
if (!function_exists($ftypeg)) return false;
$ftypeg($idest, $dest, $quality);

imagedestroy($isrc);
imagedestroy($idest);

return true;

}


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

PEPSICOLA
17.01.2007, 02:29
Большое спасибо, на счёт маленьких превьюшек 100 на 100 это уже отдельно сделано, а вот захотят ли посмотреть на саму работу, это ещё по линку перейти надо. Поэтому происходить будет выборочно...

Интересно сколько примерно ресурсов компьютера будет требовать одно такое обращение? И сколько времени сам скрипт будет занимать... Уж действительно может лучше отдельно залить, а то при n'ом количестве посещений и запросов нагрузка будет чрезвычайна последствиями :) Так и сервак можно убить если захотеть :)

nc.STRIEM
17.01.2007, 02:54
кодирование одной картинке займет около ~2 секунд
я так пологая у тя тм будет галерея.....
короч лучше сделай 3 папки, одно с превюхами дето 100Х100, вторая для просмотра гдет 640Х480 а третья с фотками для скачки там уже от 1024Х768 и выше....

PEPSICOLA
17.01.2007, 04:59
А можно ли сделать такую вещь:
<body>
<img name="" src="" width="600" height="440" alt="">
</body>
Но с условием что при указании scr картинка просто складывалась относительно пропорциям...
То есть не теряя форму, не растягивалась только в ширину или только в длинну...