воскресенье, 17 апреля 2011 г.

Thanks to Paul Allen...

У меня произошла некоторая проблема при работе с одним проектом.

Я использовал модуль GD::SecurityImage при создании каптчи. Модуль удобный тем, что может использовать разные библиотеки в бекграунде, по умочанию, естественно, GD.

Чисто для справки, мне больше нравиться использовать Image::Magick, но вот не могу подружить данную замечательную библиотеку с одним сервером на freebsd.

В общем стала задача при определенных условиях изменять размеры картинкам. Для чего был использован замечательный модуль Image::Resize.

Каково было мое удивление, когда мне утром позвонил заказчик с жалобой что все каптчи стали выдаваться с черным бекграундом. :(

Новость была паршивая, так как модуль для работы с каптчами я не трогал. При ее создании было установлен параметр bgcolor как [255,255,255], то есть явно белый. Работа с графикой в принципе поменялась лишь благодаря добавлению ресайзу картинок. Причем картинки, это были часть контента сайта, и с каптчей ни каким образом не пересекались.

С начала логически, а потом экспериментально,, было выявлено, что каптча меняет бекграунд при добавлении строки 'use Image::Resize;'. Модуль где происходил ресайз и модуль для генерации капчи друг-друга не вызывали, то есть возможный ре-импорт какой-либо функции я откинул (Но оба модуля вызывались одним fcgi скриптом).

Значит вызов Image::Resize, чего-то менял в окружении или в логике работы самой GD.

perldoc -m Image::Resize;

Жму v.

Открывается vim c кодом модуля Image::Resize.

10-11 строчки

# Thanks to Paul Allen for this tip
GD::Image->trueColor( 1 );

Что за нафиг?

perldoc GD

Ищу метод trueColor. Пишут такое:

For backwards compatibility with scripts previous versions of GD, new images created from scratch (width, height) are palette based by default. To change this default to create true color images use:

GD::Image->trueColor(1);

somewhere before creating new images. To switch back to palette based by default, use:

GD::Image->trueColor(0);

Ну что же. Можно попробовать изменить.

Добавляю у себя перед созданием каптчи GD::Image->trueColor(0).

И у меня создается каптча с белым бекграудом! Ура! То что нужно!

Вот так фикс Пола Аллена испортила мне воскресный вечер. Thanks to Paul Allen....

Если кто-то знает в чем была проблема, зачем нужно использовать trueColor и почему могла возникнуть такая бага пишите в комменты. Если ответа не поступит обещаю в последующих постах раскрыть тему глубже.


С ув. antonfin.

4 комментария:

  1. Чтобы жизнь медом не казалась, Пол Аллен позаботился.

    ОтветитьУдалить
  2. Кстати где-то в коде мейлуа есть GD::Image->trueColor(0) я с этим чудным черным фоном сталкивался

    ОтветитьУдалить
  3. >Каково было мое удивление, когда мне утром >позвонил заказчик с жалобой что все каптчи стали >выдаваться с черным бекграундом. :(

    То есть оно работало работало,а затем перестало?
    Или просто на этом сервере никогда не работало?
    И какая версия GD на сервере?

    ОтветитьУдалить
  4. Я же писал, работал проект, каптча была и нормально отображалась на белом фоне. После добавление нового функционала (ресайза картинок (части контента, не каптчи)) каптча стала создаваться с черным бекграундом.

    Отвечая кратко на вопросы:
    1) оно работало и перестало
    2) на сервере изначально все работало
    3) версия GD - 2.44

    ОтветитьУдалить