Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/10/03 в 17:27 |
Никто не подскажет нормальный алгоритм создания тумбы под GD 2.0?
Сохранение пропорции, вырезание центральной части, етц не нужно. У меня это все делает вспомогательная функция. Делает нормально.
А вот сама функция ресайза такую фигню порет...
Честно - я уже переюзал все примеры кодов на php.net по этой теме. И бикубические и простые. И с imagecreatetruecolor и без нее.
В общем создает тумбы иногда качественные, но иногда очень плохие (цветовая гамма нарушена, хотя я ее копирую или яркость сильно завышена).
Вот собственно функция, на которой я застрял. Вроде бы лучшая из остальных (реже лажу показывает):
Код: |
function ImageCopyResampleBicubic (&$dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
{
$palsize = ImageColorsTotal ($src_img);
for ($i = 0; $i < $palsize; $i++) { // get palette.
$colors = ImageColorsForIndex ($src_img, $i);
ImageColorAllocate ($dst_img, $colors['red'], $colors['green'], $colors['blue']);
}
$scaleX = ($src_w - 1) / $dst_w;
$scaleY = ($src_h - 1) / $dst_h;
$scaleX2 = (int) ($scaleX / 2);
$scaleY2 = (int) ($scaleY / 2);
for ($j = $src_y; $j < $dst_h; $j++) {
$sY = (int) ($j * $scaleY);
$y13 = $sY + $scaleY2;
for ($i = $src_x; $i < $dst_w; $i++) {
$sX = (int) ($i * $scaleX);
$x34 = $sX + $scaleX2;
$color1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, $sX, $y13));
$color2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, $sX, $sY));
$color3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, $x34, $y13));
$color4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, $x34, $sY));
$red = ($color1['red'] + $color2['red'] + $color3['red'] + $color4['red']) / 4;
$green = ($color1['green'] + $color2['green'] + $color3['green'] + $color4['green']) / 4;
$blue = ($color1['blue'] + $color2['blue'] + $color3['blue'] + $color4['blue']) / 4;
ImageSetPixel ($dst_img, $i + $dst_x - $src_x, $j + $dst_y - $src_y, ImageColorClosest ($dst_img, $red, $green, $blue));
}
}
}
|
Юзаю ее примерно так:
Код: |
//$src - исходная картинка
$dst=imagecreate(120, 180);
$scX=imagesx ($src);
$scY=imagesy ($src);
ImageCopyResampleBicubic($dst,$src,0,0,0,0,$w,$h,$scX,$scY);
//дальше - сохраняю и в поток
|
В общем на одних размерах тумбы выдает нормальный результат - на других фигню.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/10/03 в 17:34 |
Да. И еще. Только что запустил в "боевых" условиях.
Вышеуказанная бикубическая функция неебацца тормозит.
|
|
|
|
Nobody knows better...
С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200
|
Добавлено: 05/10/03 в 18:02 |
У меня все прекрасно работает.... я в граббере своем использую...
И ничего не тормозит.... Ты где вообще такой алгоритм вырвал?
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/10/03 в 18:10 |
Ну вот например:
или
Я бы не назвал это нормальным.
А вот если другую пропорцию тумбы попробывать, то все нормально будет.
|
|
|
|
пенсионер
С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166
|
Добавлено: 05/10/03 в 18:11 |
я тож долго мучился... а потом просто командную строку из РНР скрипта вызывал типа
djpeg $sourcefile | /usr/pnmscale -xysize $dest_x $dest_y |/usr/pnmcut -pad $cnt_x 0 $xxx $yyy| cjpeg -quality 70 > $targetfile
почему то гдлиб в рнр ОЧЕНЬ чуствителен к формату исходной картинки и пропорциям
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/10/03 в 18:24 |
bog, я в Юниксе не особо разбираюсь.
Если не трудно, объясни, что значит каждая команда.
|
|
|
|
С нами с 08.07.03
Сообщения: 40
Рейтинг: 16
|
Добавлено: 05/10/03 в 18:31 |
а imagemagik чем неугодил тебе?
|
|
|
|
пенсионер
С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166
|
Добавлено: 05/10/03 в 18:39 |
Pentarh писал: | bog, я в Юниксе не особо разбираюсь.
Если не трудно, объясни, что значит каждая команда. |
да я и сам нифига не понимаю... я наугад пишу
насколько я помню примерный смысл....
djpeg - перекодирует картинку в формат с которым работают остальные команды
/usr/pnmscale собствено делает тумбу с сохранением исходных пропорций
/usr/pnmcut обрезает картинку в соответствии с параметрами
cjpeg -quality 70 > $targetfile сохраняет картинку в формате джпег с качеством 70.
по каждой команде можно МАН сделать или
--help
и тебе целый список опций покажут.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/10/03 в 18:44 |
MaximatoR писал: | а imagemagik чем неугодил тебе? |
И что это за хрень? Точнее какой imagemagik ты имеешь ввиду? Их много вроде.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 05/10/03 в 18:51 |
bog писал: | Pentarh писал: | bog, я в Юниксе не особо разбираюсь.
Если не трудно, объясни, что значит каждая команда. |
djpeg - перекодирует картинку в формат с которым работают остальные команды
/usr/pnmscale собствено делает тумбу с сохранением исходных пропорций
/usr/pnmcut обрезает картинку в соответствии с параметрами
по каждой команде можно МАН сделать или
--help
и тебе целый список опций покажут. |
djpeg, cjpeg - есть такое на серваке.
pnmscale, pnmcut - нету блин :-(
Это я так понял эта хрень: http://netpbm.sourceforge.net/ ?
Запускаем ВМварю :-)
|
|
|
|
С нами с 04.01.03
Сообщения: 71
Рейтинг: 98
|
Добавлено: 05/10/03 в 19:55 |
|
|
|
|
+
С нами с 03.09.03
Сообщения: 290
Рейтинг: 7
|
Добавлено: 05/10/03 в 20:25 |
|
|
|
|
пенсионер
С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166
|
Добавлено: 05/10/03 в 20:36 |
Да вроде оно... хотя по идее если у тебя предыдущее стоит - то должнол и это быть...
попробуй поиск запустить, мож у тебя каталог не стандартный для инх.
|
|
|
|
С нами с 08.07.03
Сообщения: 40
Рейтинг: 16
|
Добавлено: 05/10/03 в 20:48 |
Pentarh писал: |
И что это за хрень? Точнее какой imagemagik ты имеешь ввиду? Их много вроде. |
barc тебе ответил %)
я юзаю его так для тумбл ( php)
Код: |
.....
//$val=файло для тумблы (оригинал)
$str="/usr/local/bin/convert -size 120x120 -quality 70 $path/$val -resize 120x120 $path/th/$val";
system($str,$errors);
......
|
|
|
|
|
С нами с 26.02.03
Сообщения: 788
Рейтинг: 299
|
Добавлено: 05/10/03 в 23:04 |
А кто знает пристойную библиотеку, которая не грузит сервак? ГД Ну _очень_ любит есть ресурсы, особенно если обрабатываешь по 100 фоток в минуту. Без задержек всё валит нах, а с задержками работает не так быстро, как надо. Или мож его можно настроить, что-нибудь типа safe mode?
|
|
|
|
пенсионер
С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166
|
Добавлено: 05/10/03 в 23:18 |
если в РНР то там лимит на использование памяти можно поставить.
+ все переменные очищай если в цикле работаешь. ато мож у тебя кешируется что нить крупное.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 06/10/03 в 01:22 |
Всем бальшущее спасибо. Есть достаточно тем для размышлений и изучений/тестирования.
Тут поговорил с одним коллегой в оффлайне, тот говорит что imagemagik внатуре рулит. Будем пробовать, юзать, изобретать (велосипед :-) ).
Респекты!
|
|
|
|
Nobody knows better...
С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200
|
Добавлено: 06/10/03 в 03:01 |
Imagemagick - рулит конечно, но у меня народ и на ГД2 не жалуется
Вот все работает прекрасно....
$destImage=imagecreatetruecolor($destWidth, $destHeight);
ImageCopyResampled($destImage,$srcImage,0,0,0,0,$destWidth,$destHeight,$srcWidth,$srcHeight);
$destWidth, $destHeight - размеры тумбы
$srcWidth,$srcHeight - размеры исходной картинки
$srcImage - ссылка на открытую исходную картинку...
Да и вообще RTFM - я все по доке делал....
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 06/10/03 в 05:41 |
Weber писал: | Imagemagick - рулит конечно, но у меня народ и на ГД2 не жалуется
Вот все работает прекрасно....
$destImage=imagecreatetruecolor($destWidth, $destHeight);
ImageCopyResampled($destImage,$srcImage,0,0,0,0,$destWidth,$destHeight,$srcWidth,$srcHeight);
$destWidth, $destHeight - размеры тумбы
$srcWidth,$srcHeight - размеры исходной картинки
$srcImage - ссылка на открытую исходную картинку...
Да и вообще RTFM - я все по доке делал.... |
Читай внимательней, о чем я писал.
Я RTFM этот мануал вдоль и поперек и перепробовал все варианты и твой в том числе. Глянь картинки выше - примерно такой результат ИНОГДА получается. Но чаще всего все Ок. И это иногда меня собственно и не устраивало.
2All:
Консольная команда
Код: |
mogrify -geometry 120x120! picture.jpg
|
переделывает картинку picture.jpg в тумбу 120x120 быстро и качественно. Требует Imagemagik.
barc, MaximatoR - thanks! :-)
Проблема решена.
|
|
|
|
Nobody knows better...
С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200
|
Добавлено: 06/10/03 в 11:32 |
Проблема - решена, но все же....
Ты какое качество выставлял при сохранении картинки? Я помню, что я ничего не выставлял, т.е. использовал по-умолчанию и у меня порой - тоже получались такие "ужасы".
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 06/10/03 в 15:32 |
Weber писал: | Проблема - решена, но все же....
Ты какое качество выставлял при сохранении картинки? Я помню, что я ничего не выставлял, т.е. использовал по-умолчанию и у меня порой - тоже получались такие "ужасы". |
Да разное выставлял. Качество не так влияет на цветовую гамму, как это показано на картинках вверху. Чем ниже качество, тем смазанней картинка просто и все. А тут проблема я так понимаю в самом GDlib. Видишь - там цвета нарушены, а на маленькой гамма-коррекция большая (яркая сильно). Чего-то он не правильно делает с палитрой. Или проблема с этими всякими бикубическими алгоритмами.
Просто когда я той же картинке ресайз делаю (с соблюдением aspect ratio) на других размерах, то получается вполне даже ничего. А скрипт мой должен делать нормальные тумбы любых размеров. К тому же в copyimageresampled (copyimageresized) качество хромает по сравнению с imagemagik, а бикубический алгоритм это настоящий тормоз.
Так что получается идеальный варик в этой ситуации imagemagik.
|
|
|
|
Nobody knows better...
С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200
|
Добавлено: 07/10/03 в 17:31 |
Я почему-то сразу сел на ГД, потом перешел на ГД2... и меня, да и тех, кто граббером пользуется - качество устраивает... никаких конфликтов не возникает...
Может и правда "кривая" версия ГД
|
|
|
|
С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096
|
Добавлено: 07/10/03 в 17:49 |
Pentarh: если есть желание все таки переползти назад на GD2 - стукни мне 163 82 79 56. мне тогда хоть будет стимул залезть поискать мою функцию.. единственное, у меня там можно только центрированные тумбы делать. просто так ебался в свое время с тем чтобы их центрированными сделать, что до обычных потом руки не дошли  бикубический алгоритм там не используется.
|
|
|
|
С нами с 11.08.03
Сообщения: 155
|
Добавлено: 08/10/03 в 00:50 |
А я приведу сразу код всей страницы.
Попробуй его, он проверенный. У меня у самого при переходе от GD1 к GD2 была аналогичная проблема, и она решилась.
Использовать так.
1. Сохраняешь этот код в index.php.
2. В том же каталоге создаешь подкаталоги 1 и 2. Присваиваешь им права 0777.
3. Кидаешь в подкаталог 1 картинки.
4. Запускаешь скрипт. Получаешь в подкаталоге 2 тумбы.
Размеры тумб, названия подкаталогов и префикс в именах файлов тумб задаются в начале скрипта переменными.
Сообщи здесь же о результатах.
Код: | <html>
<head>
<title></title>
<body bgcolor='#FFFFFF' leftmargin='4' topmargin='8'>
<center>
<?
$max_thumb_horizontal_size = 150;
$max_thumb_vertical_size = 150;
$prefix = "t";
$source = "./1";
$dest = "./2";
$d = opendir($source);
while ($file = readdir($d))
{
if ($file=="." or $file=="..")
continue;
$pic = $source . "/" . $file;
$path = $dest . "/" . $prefix . $file;
create_thumbnail($path,$pic);
}
closedir($d);
echo ("Successfully created");
function create_thumbnail($path,$pic)
{
global $max_thumb_horizontal_size, $max_thumb_vertical_size;
$image_stats = getimagesize($pic);
$image_width = $image_stats[0];
$image_height = $image_stats[1];
$image_type = $image_stats[2];
if (file_exists($path))
unlink($path);
if ($image_width>$max_thumb_horizontal_size or $image_height>$max_thumb_vertical_size)
{
if ($image_width>$max_thumb_horizontal_size)
{
$ratio = $image_width/$max_thumb_horizontal_size;
$image_width = $max_thumb_horizontal_size;
$image_height = round($image_height/$ratio);
}
if ($image_height>$max_thumb_vertical_size)
{
$ratio = $image_height/$max_thumb_vertical_size;
$image_width = round($image_width/$ratio);
$image_height = $max_thumb_vertical_size;
}
}
$src_img = imagecreatefromjpeg($pic);
$dst_img = imagecreatetruecolor($image_width,$image_height);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$image_width,$image_height,imagesx($src_img),imagesy($src_img));
imagejpeg($dst_img,$path);
chmod($path,0777);
}
?>
</center>
</body>
</html> |
|
|
|
|
Nobody knows better...
С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200
|
Добавлено: 08/10/03 в 03:28 |
sailor: Вот у меня аналогичный способ создания.... давай версии ГД2 сверим?
GD Version 2.011
|
|
|
|