Сжатие картинки на лету

Dreamer76

Through thorns
Сжатие картинки на лету

У меня такая проблема.
Делаю фотогалерею. Предполагается, что картинка 200 на 300 точек будет отображаться 100 на 150, т.е. ужиматься "на лету" в 2 раза...

Файл "ужималку" написал:

<?php

if (!$max_width)
$max_width = 100;
if (!$max_height)
$max_height = 150;

$size = GetImageSize($image);
$width = $size[0];
$height = $size[1];

$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;

if ( ($width <= $max_width) && ($height <= $max_height) ) {
$tn_width = $width;
$tn_height = $height;
}
else if (($x_ratio * $height) < $max_height) {
$tn_height = ceil($x_ratio * $height);
$tn_width = $max_width;
}
else {
$tn_width = ceil($y_ratio * $width);
$tn_height = $max_height;
}

$src = ImageCreateFromJpeg($image);
$dst = ImageCreate($tn_width,$tn_height);
ImageCopyResized($dst, $src, 0, 0, 0, 0,
$tn_width,$tn_height,$width,$height);
header("Content-type: image/jpeg");
ImageJpeg($dst, null, -1);
ImageDestroy($src);
ImageDestroy($dst);

?>

Выводится так:

<img src=resize.php?image=<?print($row['pic']);?>>

Все работает. Ужимает как надо. Но картинка (изначально полноцветная) в итоге получается какая-то странная: цветов всего 2-3 .. и в коричневых тонах.. в очень LOW качестве.

Что влияет на ее качество? Помогите пожалуйста :(

Спасибо.
 

neko

tеam neko
[m]imagecreatetruecolor[/m]
а картинки наверное в базе у тебя, да? :)
 

jer

...
лучше на лету не ресайзь, храни в двух вариантах. а ресайзь при закачке на сервер.
 

Dreamer76

Through thorns
Originally posted by jer
лучше на лету не ресайзь, храни в двух вариантах. а ресайзь при закачке на сервер.
ну и какой смысл плодить кучу файлов?
почему не рес. на лету?

-~{}~ 09.12.04 09:56:

Отлично.
Работает.
Спасибо!
 

jer

...
а какой смысл ресайзить каждый раз при обращении к картинке?

тратить на это часто нехватающих ресурсов. а ресайзинг достаточно ресурсоемкая операция. еще если у тебя на странице будет по 20 превьюшек выводиться?
к тому же дискового места они у тебя займут не много. ~7 Кб превьюшка, итого 7 Мб на 1000 картинок. у тебя же не миллион картинок будет?

на диск ты тратишься единожды, а ресурсы жрутся при каждом обращении.
 

neko

tеam neko
jer
чего ты прикопался тут
вопрос был как исправить качество, а не про смысл
тебе назвать пару причин почему это может быть удобно или сам догадаешся?
 

jer

...
я не прикопался, а по сути человеку подсказываю. раз он впервые пишет фотогалерею.

его право принять или отказаться.


ну догадываться можно долго, говори уж...
только, плиз, весомый аргумент, а не мелкие неудобства.
 

neko

tеam neko
да пожалуйста
дано:
база фотоснимков на 300гб
а теперь дети посчитайте:
сколько займут тюмбы к ней при условии что они предоставляются в 3х разных вариантах (побольше помельче) + пользователь может их просматривать в собственноручно выбранном размере

-~{}~ 09.12.04 10:50:

я не говорю уже про проблемы с тем где расположить все это дело
в одну директорию не кинешь эту кучу тюмб даже если захочешь выделить 20-30гиг под превьюшки
 

jer

...
блин,

1-е: до 300 Гб ему еще ой как далеко

2-е: обычно одного размера превьюшек достаточно, ну максимум 2-х. (см. 5-е)

3-е: накладные расходы выражаются в %-х. будь то 300 Гб, будь то 20 Мб. и процент этот будет невелик (порядка нескольких %). Т.е. на фоне общего объема данных даст совсем незначительный прирост. Если у тебя есть 300Гб для фоток, неужели не найдется еще несколько для превьюшек?

4-е: насчет размера превьюшек в зависимости от желания пользователя - это уже фантазии. на практике такое нафиг не нужно в фотогалерее.


5-е:

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

6-е: пока все это писал - родился вариант с кешированием наиболее частоиспользуемых превьюшек на уровне скрипта-ресайзера. таким образом можно ограничить размер кеша.

ps: хотя для Dreamer76 все же см. п. 1-4, 5-6 - потребуется для реально большой серьезной галереи.
 

Dreamer76

Through thorns
Ребят. Тут галерея не для сайта знакомств, а для девушки. В личный альбом. Так что, спасибо ! :)
 

neko

tеam neko
jer
это не фантазии
это, поверь уж мне, случай из жизни
людям удобно
а место на рейдах стоит дорого и это не несколько процентов а порядка 15

ну и чтобы прийти к общему мнению предлагаю компромисное решение - самые частоиспользуемые превьюшки хранить в статике, а редкоиспользуемые генерить динамически.
ага я смотрю до тебя доходит :)
в общем-то так примерно и сделано
 

jer

...
я тоже не из пальца высосал. и мне уж поверь.

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

до кого доходит, а до кого и нет %)
 

Фанат

oncle terrible
Команда форума
jer, не понимаешь ты ничего.
чем говеннее будет галерея у девушки, и чем сильне будет она тормозить, тем меньше будет конкурентов у программиста
 

neko

tеam neko
jer
да ради бога настаивай :)
это же не я тебя пример просил :)

а желание это озвучивается всякий раз когда с одной библиотекой работают, скажем так, представители разных профессий -- например фотографы и те кто снимки продает

ну для нашей стандартной домашней странички сойдет любой стандартный подход
 

jer

...
Фанат
%)))

так ему и надо было тему несколько другую писать (про удержание девушки ...) (Dreamer76, соррри)

neko
ладно, все остыли. все курят в сторонке.

у меня вопросов нет!
 

Dreamer76

Through thorns
Jer, девушке 5 лет.
LOL :)

И действительно пойду покурю в сторонке
 

Фанат

oncle terrible
Команда форума
jer
У neko такой период просто. Не обращай внимания.
Все правильно ты говоришь.
просто каждый в этом топике пытается заставить думать другого.
 

jer

...
понял.

я в принципе понимаю о чем neko говорит. только для данного контекста это нафиг не нужно. вот и все что я хотел сказать ;) (а сказал больше...:)
 

Moses Fender

Guest
видимо, так и не решили ничего?
расскажу в чем беда, потому что недавно сам с таким столкнулся. Пришлось на хостинге httpd.conf подкорректировать.
Вобщем, нужна GD2. И делать заготовку для картинки ImageCreateTrueColor . Вот например: http://www.sko.ru/c_show_photo.htm?descr=3,247
Чтобы сделать прозрачные полосочки, пришлось переключаться на GD2. И там и случилась такая вот проблема, которую описал Dreamer76: заготовка, созданная при помощи ImageCreate - имеет ограниченный набор цветов. И от этого на картинке цветная вуаль.
Ну и об альфа-канале в палетной картинке тоже мечтать не приходится :)
 
Сверху