Войти

Показать полную графическую версию : Качественный ресайз картинки "на лету" без сохранения


3xmax
31-10-2007, 17:26
Здавствуйте.
Сам я даже не начинающий програмист. Дизайнер я. По части программинга чаще пользуюсь тем, что найду в сети, иногда получаются какие-то элементарные вещи. Поэтому даже вполне рабочий со слов людей код требующий доработки я вряд ли смогу приладить для своих нужд.
Есть задача на лету уменьшить размер картинки с 650 до 500 пикселей по ширине, а если размер менее или равен 500 то оставлять как есть.
Ниже код, который работает, но на выходе дает мягко говоря не очень качественое изображение.
Есть еще одна проблема, на странице может быть и несколько картинок подряд. И еще - нужно, чтобы урл на саму картинку остался прежним, иначе в гугл имидж все проиндексированные картинки вылетят.

Заранее спасибо за помощь и уж простите за наглость.


<?PHP
$SQL = "SELECT * FROM $db_name_pict WHERE vis=0 AND id_work=$id";
$vopr=mysql_query($SQL) or die ("No way. Can't select");

while ($line = @mysql_fetch_array($vopr)) {
extract($line);

$image = "/home/domain/public_html/p/$urlpicbig";
$size = getimagesize("$image");
$height = $size[1];
$width = $size[0];
if ($height > 650)
{
$height = 650;
$percent = ($size[1] / $height);
$width = ($size[0] / $percent);
}
else if ($width > 649)
{
$width = 500;
$percent = ($size[0] / $width);
$height = ($size[1] / $percent);
}
echo "<img src=\"http://www.domain.com/p/$urlpicbig\" height=\"$height\" width=\"$width\" />";}

}

?>

benya
31-10-2007, 18:33
Правильно. Вы же не режете картинку, а масштабируете в браузере. При таком подходе качественного изображения не будет. Нужно резать картинку и пересохранять чем-то типа Image-Magick. И урл на картинку можно оставить прежним используя mod_rewrite. Если это вам что-то говорит конечно...

3xmax
01-11-2007, 11:21
Спасибо за наводку. Скрипт найден. :-)

benya
01-11-2007, 12:27
Дядя, так вы решили резать или открыли способ ресайза без сохранения? :clapping:

Jackdaw
01-11-2007, 15:10
Здравствуйте. Извините, что пишу в эту тему - решила, раз подобная тема уже существует, то незачем создавать еще одну.
У меня похожая ситуация, я генерирую тумбы "на лету", только проблема в том, что до их вывода у меня выводится еще масса всякой всячины, т.е. хидер header("Content-type: image/jpeg") я отослать не могу, и соответственно, поскольку кракозябры вместо изображения никого не порадуют, приходится сохранять тумбы на диске. Может есть у кого идеи, как же все-таки обойтись без сохранения на диск и умудриться отослать этот чертов хидер? Идея использовать буферизацию у меня оптимизма не вызывает, поскольку контент выводится несколькими модулями =/
Заранее благодарна за помощь.

vadimiron
01-11-2007, 16:37
Jackdaw,
Сделайте скрипт, который выводит только нужную картинку. И вставляйте адрес этого скрипта в HTML тег img

<img src='get_image.php?image_id=1234' />

Вот в этом скрипте и выводите нужные хедеры

benya
01-11-2007, 20:39
Jackdaw,
У вас наверное неправильный стиль программирования. Сами напутали, а нам тем более непонятно. Зачем много модулей выводят одно и тоже? Или одно частями? ;)
Да и зачем вам тумбы на лету? Они будут генерироваться невыносимо долго на самом быстром сервере.

Jackdaw
01-11-2007, 22:02
vadimiron,
Спасибо за совет=) К сожалению, в таком варианте джипег, который подается на вход, скрипт самым странным образом не видит...
Warning: imagecreatefromjpeg("img/flats/50.jpg") [function.imagecreatefromjpeg]: failed to open stream: No such file or directory [...]
вот скрипт res_perc.php
<?
$im=imagecreatefromjpeg($infile);
$w=imagesx($im)*$perc/100;
$h=imagesy($im)*$perc/100;
$im1=imagecreatetruecolor($w,$h);
imagecopyresampled($im1,$im,0,0,0,0,$w,$h,imagesx($im),imagesy($im));

header("Content-type: image/jpeg");
imagejpeg($im1,"",$qual);
imagedestroy($im);
imagedestroy($im1);
?>
Хотя если вызывать не скрипт, а инклудить функцию с точно таким же кодом, то та же функция imagecreatefromjpeg, которая и выдает ошибку, этот файл прекрасно видит... В чем тут дело - ума не приложу...

benya,
Я ничего не путала =) Я сейчас работаю над порталом недвижимости, надеюсь, Вы не обидитесь, если я на Вашу шпильку о стиле программирования отвечу тем же - надеюсь, Вы имеете представление о том, как генерятся страницы с динамическим содержанием, включающие выборки из базы данных, ленты новостей и прочую информацию... А насчет времени генерации - я в курсе =) Но так уж сложилось, что мне нужно с этим разобраться.

vadimiron
01-11-2007, 23:53
А что file_exists() выдаёт?

Jackdaw
02-11-2007, 00:42
Что все ок =/

vadimiron
02-11-2007, 02:01
Jackdaw,

Я помню, что там чтото было такое....хм...
Пока не вспомнил - попробуйте использовать абсолютный путь, то есть как на диске файл лежит, переменные окружения содержат всю нужную информацию.

benya
02-11-2007, 13:16
Jackdaw,
Я сейчас работаю над порталом недвижимости, надеюсь, Вы не обидитесь, если я на Вашу шпильку о стиле программирования отвечу тем же - надеюсь, Вы имеете представление о том, как генерятся страницы с динамическим содержанием, включающие выборки из базы данных, ленты новостей и прочую информацию...
Нет не имею. Я ошибся веткой. Я думал что мы здесь обсуждаем как приготовить пельмени :cry:

А можете позже показать результат своей работы? ;)

Vlad Drakula
02-11-2007, 19:11
Jackdaw
Хотя если вызывать не скрипт, а инклудить функцию с точно таким же кодом, то та же функция imagecreatefromjpeg, которая и выдает ошибку, этот файл прекрасно видит... В чем тут дело - ума не приложу... »
мне кажется что скрипт который выдает картинку и подключаемый скрипт лежат в разных дерикториях?

Я ничего не путала Я сейчас работаю над порталом недвижимости, надеюсь, Вы не обидитесь, если я на Вашу шпильку о стиле программирования отвечу тем же - надеюсь, Вы имеете представление о том, как генерятся страницы с динамическим содержанием, включающие выборки из базы данных, ленты новостей и прочую информацию... А насчет времени генерации - я в курсе Но так уж сложилось, что мне нужно с этим разобраться. »
очень хочется это про комментировать, но я не стану, я вежливый... ;)




© OSzone.net 2001-2012