Forum Webscript.Ru

Программирование => Perl => Тема начата: el-vis от 17 Октября 2006, 18:33:30

Название: GD и SetPixel
Отправлено: el-vis от 17 Октября 2006, 18:33:30
Всем привет.

 Возникло желание сделать себе captcha на сайт но столкнулся с тем что скрипт попиксельно не хочет копировать из одного объекта в другой.
Точнее копирует только маленький кусочек, в данном случае слева.

Может быть переполняется какой-то кэш?

Вот пример кода..

#!/usr/bin/perl -w

use GD;

    print "Content-type: text/html\\n\\n";
    $imx = 120; $imy = 32;
    $im = new GD::Image($imx,$imy);
    $im2 = new GD::Image($imx,$imy);

   $black = $im->colorAllocate(0,0,0);
   $white = $im->colorAllocate(255,255,255);
   
   $im->fill(10,10,$black);
   $im->string(gdSmallFont,2,10,"simple test", $white);

   
   for($x=0;$x<$imx;$x++) {
      for($y=0;$y<$imy;$y++) {

       $im2->setPixel($x,$y,$im2->colorAllocate($im->rgb($im->getPixel($x,$y))));

      }
   }

    binmode STDOUT;
    print $im2->png;
Название: GD и SetPixel
Отправлено: NeoNox от 17 Октября 2006, 18:49:38
Проблема в циклах. Я никак не могу понять зачем ты так их построил. Есть здесь логика?

Заодно посмотр вот здесь:
http://search.cpan.org/~burak/GD-SecurityImage-1.61/lib/GD/SecurityImage.pm
Название: GD и SetPixel
Отправлено: el-vis от 17 Октября 2006, 19:14:04
Спасибо за ссылочку на модуль, изучаю..


 А что за проблема c циклами??  попровал с вайлом и антилом так вообще только фон выводит..
Дело в том что я нашел алгоритм для captcha где размывается по синусоиде и мне надо попиксельно считывать и рисовать...
Название: GD и SetPixel
Отправлено: NeoNox от 17 Октября 2006, 19:53:25
При чем тут вайл и антил?

Поясните что делает вот эта строка(по каждому действию)
$im2->setPixel($x,$y,$im2->colorAllocate($im->rgb($im->getPixel($x,$y))));
Название: GD и SetPixel
Отправлено: NeoNox от 17 Октября 2006, 20:38:49
Вот решение,

for (my $y = 0; $y < $imy; $y++)
{
                for (my $x = 0; $x < $imx; $x++)
                {
                                my $index = $im->getPixel($x, $y);
                                my ($r, $g, $b) = $im->rgb($index);

                                $index = $im2->colorResolve($b, $r, $g);
                                $im2->setPixel($x, $y, $index);
                }
}

Название: GD и SetPixel
Отправлено: el-vis от 17 Октября 2006, 20:43:39
Хм, поясняю. передаю индекс цвета из одного объекта в другой.


$im->getPixel($x,$y) - получаем индекс цвета из исходного объекта.

$im->rgb($im->getPixel($x,$y)) - из индекса получаем массив ($r,$g,$b) с числами RGB палитры


$im2->colorAllocate($im->rgb($im->getPixel($x,$y))) - на конечном объекте определяем индекс цвета с полученными параметрами RGB.

Другого способа передать индекс цвета я не вижу...
Название: GD и SetPixel
Отправлено: el-vis от 17 Октября 2006, 20:54:03
Я видимо плохо перевожу с английского, но я не вижу разницы между colorAllocate() и colorResolve().

Вам не трудно будет пояснить?
отсюда я наверное пойму, зачем сдвигать значения rgb
Название: GD и SetPixel
Отправлено: NeoNox от 18 Октября 2006, 01:08:34
Все нормально, просто он документирован плохо.
Вот вам более интересный источник:
Цитировать
http://www.douzhe.com/down/perl/Manning%20-%20Graphics%20Programming%20With%20Perl%20-%202002%20-%20(By%20Laxxuss).pdf