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

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

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

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

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 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);
   }
}

0
 



С нами с 11.08.03
Сообщения: 155

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

У меня в phpinfo написано просто GD 2.0. Ну это собственно неважно, так как это работает на самых разных серверах в инете, и версии там самые разные.

Последний раз редактировалось: sailor (09/10/03 в 16:32), всего редактировалось 1 раз

0
 

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

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

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

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

Ну че, а-ля Open Source? :-)
Кто поможет?

0
 



С нами с 11.08.03
Сообщения: 155

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

Дык ты скажи, заработало у тебя то, что я дал?
Интересно же. icon_smile.gif

0
 



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


если у тебя криво работает из-за этого - то расскажу потом как я обошел это дело.

0
 

www.2dayhost.com

С нами с 16.12.02
Сообщения: 1530
Рейтинг: 755

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

Pentarh, если ты юзаешь gd 2.0.1 или выше и php 4.0.6 или выше то используй imagecreatetruecolor, а не imagecreate smail21.gif

0
 

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

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

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

sailor писал:

Дык ты скажи, заработало у тебя то, что я дал?
Интересно же. icon_smile.gif


Поверь, я уже так пробовал. Принципиально не хочу 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 :-) Выставляю открытым код взамен на техническую поддержку. Хэлп.

0
 



С нами с 24.01.03
Сообщения: 1498
Рейтинг: 539

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

где можно качнуть стабильную версию GD в сорцах и рпм?

Товары из США

0
 

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

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

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

0
 



С нами с 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"? Лучше с примерами icon_smile.gif

1
 

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

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

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

В теле IF после строчки
Код:

if ($s_prop!=$proportion)


ИНОГДА неправильно считаются размеры, до которых нужно ресайзнуть картинку. В результате иногда получается тумба не тех размеров, которые задавал (чуть меньше одна сторона). Вот и все. Надо чтобы правильно считала.

Энибади хэлп?

0
 



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

1
 

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

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

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

barc, мои респекты и максимальная оценка! :-)

В качестве вознаграждения всем ответившим и не только им, я доработал немного код и создал класс PHP для создания тумб.
Все, что надо - имя исходного файла, имя файла тумбы и размеры тумбы. Быстро и качественно.

Да здравствует Open Source! Юзайте на здоровье!

Выложил его здесь:
http://all-sex-links.com/awm/os_create_thumbnail.htm

Код доступен здесь:
http://all-sex-links.com/awm/files/thumb.inc.php.txt

0
 



С нами с 29.02.04
Сообщения: 1118
Рейтинг: 883

Ссылка на сообщениеДобавлено: 07/03/04 в 13:32       Ответить с цитатойцитата 

Извиняюсь, что поздно отвечаю
тока что прочитал
А чем не устраивает модуль Imager ? Есть в том же CPAN архиве...

0
 

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

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

Ссылка на сообщениеДобавлено: 07/03/04 в 21:02       Ответить с цитатойцитата 



Насколько я знаю, CPAN это типа для Перла....

0
 

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

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

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

Кстати. Ссылочки битые.
Цитата:

Выложил его здесь:
http://all-sex-links.com/awm/os_create_thumbnail.htm

Код доступен здесь:
http://all-sex-links.com/awm/files/thumb.inc.php.txt


Соответственно теперь
http://awm.all-sex-links.com/os_create_thumbnail.htm
http://awm.all-sex-links.com/files/thumb.inc.php.txt

0
 



С нами с 01.10.03
Сообщения: 751
Рейтинг: 318

Ссылка на сообщениеДобавлено: 07/03/04 в 21:35       Ответить с цитатойцитата 

Pentarh молодец!
просто супер!
крепко жму твою руку smail44.gif
...правда млять на hqhost у меня не заработало icon_sad.gif
кривые ручки поправил и стало всё ок
...маленькое такое замечание - по успеху выводится не трю а единица

Лучший Хостинг для CJ сайтов!

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

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


Перейти:  



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

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

Опросы

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



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