Реклама на сайте Advertise with us

GDlib 2.016 - создание тумб

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 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);
//дальше - сохраняю и в поток


В общем на одних размерах тумбы выдает нормальный результат - на других фигню.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/10/03 в 17:34       Ответить с цитатойцитата 

Да. И еще. Только что запустил в "боевых" условиях.
Вышеуказанная бикубическая функция неебацца тормозит. icon_sad.gif

0
 

Nobody knows better...

С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200

Ссылка на сообщениеДобавлено: 05/10/03 в 18:02       Ответить с цитатойцитата 

У меня все прекрасно работает.... я в граббере своем использую...
И ничего не тормозит.... Ты где вообще такой алгоритм вырвал?

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/10/03 в 18:10       Ответить с цитатойцитата 

Ну вот например:



или



Я бы не назвал это нормальным.
А вот если другую пропорцию тумбы попробывать, то все нормально будет.

0
 

пенсионер

С нами с 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

почему то гдлиб в рнр ОЧЕНЬ чуствителен к формату исходной картинки и пропорциям icon_sad.gif

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

1
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/10/03 в 18:24       Ответить с цитатойцитата 

bog, я в Юниксе не особо разбираюсь.
Если не трудно, объясни, что значит каждая команда.

0
 



С нами с 08.07.03
Сообщения: 40
Рейтинг: 16

Ссылка на сообщениеДобавлено: 05/10/03 в 18:31       Ответить с цитатойцитата 

а imagemagik чем неугодил тебе?

Design: http://adult-designer.net

0
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 05/10/03 в 18:39       Ответить с цитатойцитата 

Pentarh писал:
bog, я в Юниксе не особо разбираюсь.
Если не трудно, объясни, что значит каждая команда.


да я и сам нифига не понимаю... я наугад пишу icon_smile.gif
насколько я помню примерный смысл....

djpeg - перекодирует картинку в формат с которым работают остальные команды
/usr/pnmscale собствено делает тумбу с сохранением исходных пропорций

/usr/pnmcut обрезает картинку в соответствии с параметрами

cjpeg -quality 70 > $targetfile сохраняет картинку в формате джпег с качеством 70.


по каждой команде можно МАН сделать или
--help
и тебе целый список опций покажут.

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

1
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/10/03 в 18:44       Ответить с цитатойцитата 

MaximatoR писал:
а imagemagik чем неугодил тебе?


И что это за хрень? Точнее какой imagemagik ты имеешь ввиду? Их много вроде.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 05/10/03 в 18:51       Ответить с цитатойцитата 

bog писал:
Pentarh писал:
bog, я в Юниксе не особо разбираюсь.
Если не трудно, объясни, что значит каждая команда.


djpeg - перекодирует картинку в формат с которым работают остальные команды
/usr/pnmscale собствено делает тумбу с сохранением исходных пропорций

/usr/pnmcut обрезает картинку в соответствии с параметрами

по каждой команде можно МАН сделать или
--help
и тебе целый список опций покажут.


djpeg, cjpeg - есть такое на серваке.
pnmscale, pnmcut - нету блин :-(

Это я так понял эта хрень: http://netpbm.sourceforge.net/ ?

Запускаем ВМварю :-)

0
 



С нами с 04.01.03
Сообщения: 71
Рейтинг: 98

Ссылка на сообщениеДобавлено: 05/10/03 в 19:55       Ответить с цитатойцитата 

Цитата:
И что это за хрень? Точнее какой imagemagik ты имеешь ввиду? Их много вроде.

http://www.imagemagick.org/ ... Он такой один icon_smile.gif

1
 
+


С нами с 03.09.03
Сообщения: 290
Рейтинг: 7

Ссылка на сообщениеДобавлено: 05/10/03 в 20:25       Ответить с цитатойцитата 

Посмотри http://esl.online.ee/sale@/ скрипт подходит как под GD1 - GD2
можно изучить нужную функцию cам скрипт http://singapore.sourceforge.net/index.php?page=download
я пользуюсь каталогом
скриптов на http://www.hotscripts.com там есть практически все

1
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 05/10/03 в 20:36       Ответить с цитатойцитата 

Pentarh писал:

Это я так понял эта хрень: http://netpbm.sourceforge.net/ ?

Запускаем ВМварю :-)


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

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

0
 



С нами с 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);
......

Design: http://adult-designer.net

0
 



С нами с 26.02.03
Сообщения: 788
Рейтинг: 299

Ссылка на сообщениеДобавлено: 05/10/03 в 23:04       Ответить с цитатойцитата 

А кто знает пристойную библиотеку, которая не грузит сервак? ГД Ну _очень_ любит есть ресурсы, особенно если обрабатываешь по 100 фоток в минуту. Без задержек всё валит нах, а с задержками работает не так быстро, как надо. Или мож его можно настроить, что-нибудь типа safe mode?

0
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 05/10/03 в 23:18       Ответить с цитатойцитата 

если в РНР то там лимит на использование памяти можно поставить.
+ все переменные очищай если в цикле работаешь. ато мож у тебя кешируется что нить крупное.

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 06/10/03 в 01:22       Ответить с цитатойцитата 

Всем бальшущее спасибо. Есть достаточно тем для размышлений и изучений/тестирования.
Тут поговорил с одним коллегой в оффлайне, тот говорит что imagemagik внатуре рулит. Будем пробовать, юзать, изобретать (велосипед :-) ).

Респекты!

0
 

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 - я все по доке делал....

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 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! :-)
Проблема решена.

0
 

Nobody knows better...

С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200

Ссылка на сообщениеДобавлено: 06/10/03 в 11:32       Ответить с цитатойцитата 

Проблема - решена, но все же....

Ты какое качество выставлял при сохранении картинки? Я помню, что я ничего не выставлял, т.е. использовал по-умолчанию и у меня порой - тоже получались такие "ужасы".

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 06/10/03 в 15:32       Ответить с цитатойцитата 

Weber писал:
Проблема - решена, но все же....

Ты какое качество выставлял при сохранении картинки? Я помню, что я ничего не выставлял, т.е. использовал по-умолчанию и у меня порой - тоже получались такие "ужасы".


Да разное выставлял. Качество не так влияет на цветовую гамму, как это показано на картинках вверху. Чем ниже качество, тем смазанней картинка просто и все. А тут проблема я так понимаю в самом GDlib. Видишь - там цвета нарушены, а на маленькой гамма-коррекция большая (яркая сильно). Чего-то он не правильно делает с палитрой. Или проблема с этими всякими бикубическими алгоритмами.
Просто когда я той же картинке ресайз делаю (с соблюдением aspect ratio) на других размерах, то получается вполне даже ничего. А скрипт мой должен делать нормальные тумбы любых размеров. К тому же в copyimageresampled (copyimageresized) качество хромает по сравнению с imagemagik, а бикубический алгоритм это настоящий тормоз.
Так что получается идеальный варик в этой ситуации imagemagik.

0
 

Nobody knows better...

С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200

Ссылка на сообщениеДобавлено: 07/10/03 в 17:31       Ответить с цитатойцитата 

Я почему-то сразу сел на ГД, потом перешел на ГД2... и меня, да и тех, кто граббером пользуется - качество устраивает... никаких конфликтов не возникает...
Может и правда "кривая" версия ГД

0
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 07/10/03 в 17:49       Ответить с цитатойцитата 

Pentarh: если есть желание все таки переползти назад на GD2 - стукни мне 163 82 79 56. мне тогда хоть будет стимул залезть поискать мою функцию.. единственное, у меня там можно только центрированные тумбы делать. просто так ебался в свое время с тем чтобы их центрированными сделать, что до обычных потом руки не дошли icon_smile.gif бикубический алгоритм там не используется.

0
 



С нами с 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>

0
 

Nobody knows better...

С нами с 03.10.03
Сообщения: 2141
Рейтинг: 200

Ссылка на сообщениеДобавлено: 08/10/03 в 03:28       Ответить с цитатойцитата 

sailor: Вот у меня аналогичный способ создания.... давай версии ГД2 сверим?

GD Version 2.011

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »