Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 08/10/03 в 09:41 |
Короче. Быстро и качественно делает это все mogrify.
Здесь у меня используются встроенные функции (картинки хранятся в базе):
get_image_file($id); - возвращает имя файла
get_image($id); - возвращает содержимое файла
$imgtool="/usr/bin/mogrify";
Может немного через жопу, но зато быстро и качественно. Сначала ресайзит картинку до нужного размера с соблюдением пропорции, а потом вырезает центральную часть. Так что какой размер тумбы ты задал, такой и получаешь. Даже 10x800 работает набегом.
CreateThumbnail($id,$w,$h,$name)
$id - ИД картинки в базе (при желании можно переделать, чтобы здесь передавалось имя исходной картинки)
$w,$h - ширина, высота тумбы
$name - имя результирующей тумбы.
Код: |
function imageresize($id,$w,$h)
{
global $imgtool;
$filename=get_image_file($id);
$path=pathinfo($filename);
do
{
$name="";
for($i=0;$i<=100;$i++)
$name.=rand(0,9);
}while(file_exists("temp/{$name}.".$path['extension']));
$newname="temp/{$name}.".$path['extension'];
if (!@copy($filename,$newname))
return false;
@chmod($newname,0777);
system("$imgtool -geometry {$w}x{$h}! $newname");
return $newname;
}
function CreateThumbnail($id,$w,$h,$name)
{
global $imgtool,$_REQUEST;
if ($w<=0 || $h<=0) return false;
$img=get_image($id);
if (!$img) return false;
$img=imgfromstring($img);
if (!$img) return false;
$width=$img[0];
$height=$img[1];
$type=$img[2];
$proportion=$width/$height;
$s_prop=$w/$h;
imagedestroy($img[3]);
if ($s_prop!=$proportion)
{
if ($height>$width)
{
if ($h>$w)
{
$newheight=$h;
$newwidth=round($newheight*$proportion);
}
else
{
$newwidth=$w;
$newheight=round($newwidth/$proportion);
}
}
else
{
if ($h>$w)
{
$newwidth=$w;
$newheight=round($newwidth/$proportion);
}
else
{
$newheight=$h;
$newwidth=round($newheight*$proportion);
}
}
$newname=imageresize($id,$newwidth,$newheight);
if ($newwidth>$w || $newheight>$h)
{
$dstx=($newwidth>$w)?(string)intval(($newwidth-$w)/2):'0';
$dsty=($newheight>$h)?(string)intval(($newheight-$h)/2):'0';
$sys="$imgtool -crop {$w}x{$h}+{$dstx}+{$dsty} $newname";
system($sys);
return @rename($newname,$name);
}
else
return @rename($newname,$name);
}
else
{
$newwidth=$w;
$newheight=$h;
$newname=imageresize($id,$newwidth,$newheight);
return @rename($newname,$name);
}
}
|
|
|
|
|
С нами с 11.08.03
Сообщения: 155
|
Добавлено: 08/10/03 в 13:17 |
У меня в phpinfo написано просто GD 2.0. Ну это собственно неважно, так как это работает на самых разных серверах в инете, и версии там самые разные.
Последний раз редактировалось: sailor (09/10/03 в 16:32), всего редактировалось 1 раз
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 09/10/03 в 16:10 |
Блин. Седня обнаружил, что алгоритм вырезания центральной части в некоторых случаях редких работает не корректно.
Ну че, а-ля Open Source? :-)
Кто поможет?
|
|
|
|
С нами с 11.08.03
Сообщения: 155
|
Добавлено: 09/10/03 в 16:34 |
Дык ты скажи, заработало у тебя то, что я дал?
Интересно же.
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 10/10/03 в 06:00 |
Pentarh писал: | Блин. Седня обнаружил, что алгоритм вырезания центральной части в некоторых случаях редких работает не корректно.
Ну че, а-ля Open Source? :-)
Кто поможет? |
ага. там баг в ImageCopyResampled. вот цитата из юзер комментс:
Цитата: |
As of PHP 4.0.6 (with GD 2.0.1), be aware that the srcX and srcY arguments are currently ignored, unlike ImageCopyResize. If you are resizing the whole image, then you probably won't use any source coordinates other than 0,0. But if you are resizing only a specific portion of the image, then be aware that ImageCopyResampled and ImageCopyResize are not (yet) interchangable, and you might want to stick with ImageCopyResize. |
если у тебя криво работает из-за этого - то расскажу потом как я обошел это дело.
|
|
|
|
www.2dayhost.com
С нами с 16.12.02
Сообщения: 1530
Рейтинг: 755
|
Добавлено: 10/10/03 в 07:35 |
Pentarh, если ты юзаешь gd 2.0.1 или выше и php 4.0.6 или выше то используй imagecreatetruecolor, а не imagecreate
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 10/10/03 в 15:21 |
sailor писал: |
Дык ты скажи, заработало у тебя то, что я дал?
Интересно же.
|
Поверь, я уже так пробовал. Принципиально не хочу GD использовать. У него какие-то бока с цветами.
MABPuK писал: |
Pentarh, если ты юзаешь gd 2.0.1 или выше и php 4.0.6 или выше то используй imagecreatetruecolor, а не imagecreate
|
В курсе, сэнкс. Не помогает. Я даже палитру цвет-за-цветом копировал. До задницы.
С КАЧЕСТВОМ ПРОБЛЕМ УЖЕ НЕТ.
Я НЕ ИСПОЛЬЗУЮ GDLIB ВООБЩЕ.
Я вот о чем. Я выше привел код. Отлично делает тумбы. Качественно и быстро. Юзает Imagemagick. Но... иногда некоторые тумбы вырезает некорректно. Алгоритм пересчета такой:
1. Ресайзим с соблюдением пропорции картинку до такого размера, чтобы ее потом можно было обрезать и получить тумбу жестко заданного размера.
2. Смотрим новый aspect ratio
3. Если он не равен исходному, делаем CROP до нужных размеров. При этом вырезается центральная часть.
4. Все.
В общем где-то тут зарыта собака. Он иногда неправильно делает шаг 1.
Open Source :-) Выставляю открытым код взамен на техническую поддержку. Хэлп.
|
|
|
|
С нами с 24.01.03
Сообщения: 1498
Рейтинг: 539
|
Добавлено: 10/10/03 в 18:38 |
где можно качнуть стабильную версию GD в сорцах и рпм?
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 10/10/03 в 18:58 |
|
|
|
|
С нами с 04.01.03
Сообщения: 71
Рейтинг: 98
|
Добавлено: 10/10/03 в 19:42 |
Цитата: | 1. Ресайзим с соблюдением пропорции картинку до такого размера, чтобы ее потом можно было обрезать и получить тумбу жестко заданного размера.
2. Смотрим новый aspect ratio
3. Если он не равен исходному, делаем CROP до нужных размеров. При этом вырезается центральная часть.
4. Все. |
Ты зря рабиваешь на две обработки - лишнее пересжатие в jpeg только ухудшит качество. И crop и resize можно ставить в одной команде, т.е.
mogrify -crop 600x600+0+100 -resize 120x120 1.jpg
Делает из центральной части картинки 600х800 тумбу 120 на 120.
И что ты подразумеваешь под "неправильно делает шаг 1"? Лучше с примерами
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 13/10/03 в 00:35 |
В теле IF после строчки
Код: |
if ($s_prop!=$proportion)
|
ИНОГДА неправильно считаются размеры, до которых нужно ресайзнуть картинку. В результате иногда получается тумба не тех размеров, которые задавал (чуть меньше одна сторона). Вот и все. Надо чтобы правильно считала.
Энибади хэлп?
|
|
|
|
С нами с 04.01.03
Сообщения: 71
Рейтинг: 98
|
Добавлено: 13/10/03 в 03:44 |
Попробуй так
Код: |
function imageresize($id,$rw,$rh,$cw,$ch,$cx,$cy)
{
global $imgtool;
$filename=get_image_file($id);
$path=pathinfo($filename);
do
{
$name="";
for($i=0;$i<=100;$i++)
$name.=rand(0,9);
}while(file_exists("temp/{$name}.".$path['extension']));
$newname="temp/{$name}.".$path['extension'];
if (!@copy($filename,$newname))
return false;
@chmod($newname,0777);
system("$imgtool -resize {$rw}x{rh} -crop {$cw}x{$ch}+{$cx}+{$cy} $newname");
return $newname;
}
function CreateThumbnail($id,$w,$h,$name)
{
global $imgtool,$_REQUEST;
if ($w<=0 || $h<=0) return false;
$img=get_image($id);
if (!$img) return false;
$img=imgfromstring($img);
if (!$img) return false;
$width=$img[0];
$height=$img[1];
$type=$img[2];
$proportion=$width/$height;
imagedestroy($img[3]);
$newheight=$h;
$newwidth=round($newheight*$proportion);
if ($newwidth < $w) {
$newwidth=$w;
$newheight=round($newwidth/$proportion);
}
$dstx=($newwidth>$w)?(string)intval(($newwidth-$w)/2):'0';
$dsty=($newheight>$h)?(string)intval(($newheight-$h)/2):'0';
$newname=imageresize($id,$newwidth,$newheight,$w,$h,$dstx,$dsty);
return @rename($newname,$name);
}
|
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 14/10/03 в 08:36 |
|
|
|
|
С нами с 29.02.04
Сообщения: 1118
Рейтинг: 883
|
Добавлено: 07/03/04 в 13:32 |
Извиняюсь, что поздно отвечаю
тока что прочитал
А чем не устраивает модуль Imager ? Есть в том же CPAN архиве...
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 07/03/04 в 21:02 |
Насколько я знаю, CPAN это типа для Перла....
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 07/03/04 в 21:04 |
|
|
|
|
С нами с 01.10.03
Сообщения: 751
Рейтинг: 318
|
Добавлено: 07/03/04 в 21:35 |
Pentarh молодец!
просто супер!
крепко жму твою руку
...правда млять на hqhost у меня не заработало
кривые ручки поправил и стало всё ок
...маленькое такое замечание - по успеху выводится не трю а единица
|
|
|
|