QR коды на Ruby и GD2 eveel вт 05 окт 2010 00:00:00 №1407624725

Библиотека ImageMagick применяется практически в любом Web-приложении (на языке Ruby) для обработки и композитинга изображений, рисования различных графических примитивов, и так далее.

Если говорить о применении этой библиотеки в экосистеме Ruby, то сразу на ум приходит гем RMagick, который мало того, что имеет просто невероятно неудобное API, так его использование обходится дороже, чем тупой фоновый запуск отдельных программ, входящих в пакет ImageMagick. Плюс, иногда его требовательность к версиям установленных в системе библиотек способна поразить даже самых лояльных разработчиков.

Ясен перец, что порой возникают задачи, где вся такая мощь и тяжесть ImageMagick не требуется и можно обойтись более гуманными средствами.

Думаю, большинству PHP-разработчиков хорошо знакома достаточно милая библиотека GD2. Среди Ruby-разработчиков она не пользуется большой популярностью, и это весьма грустно, ведь она способна достойно решать основные задачи работы с растровой графикой.

Существует гем gd2-ffij. Последняя его версия вышла в 2010 году, но осмотр кода показал, что развитие библиотеки остановилось отнюдь не потому, что всё очень плачевно. Дело в том, что требуемые от библиотеки задачи решены в необходимом и достаточном виде.

Легко показать, что вывести какое-нибудь изображение с помощью GD2 не так уж тяжело. Я тут накидал простенькое приложение на Sinatra, которое рисует очень красивые и приятные глазу QR-коды с заданным текстом: https://github.com/eveel/quoreux :)

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

image.draw do |canvas|
  qr.modules.each_index do |y|
    qr.modules.each_index do |x|
      canvas.color = qr.is_dark(y, x) ? dark : bright
      canvas.rectangle(x * settings.cell_width,
                       y * settings.cell_width,
                 (x + 1) * settings.cell_width,
                 (y + 1) * settings.cell_width, true)
      end
    end
  image.export image_path
end

Результат работы всего приложения выглядит примерно так:

Quoreux

Как видно, задача решена легко, с минимальными затратами ресурсов системы и человеческого времени, а значит, что иногда лучше думать, чем хвататься за ImageMagick.

Меня огорчает лишь слабая поддержка GD2 со стороны Ruby-сообщества. Интересно, с чем это связано?

blog comments powered by Disqus