Программирование на языке Ruby - [186]
>example("vw.jpg", :do_charcoal, "vw_char.jpg")
>example("vw.jpg", :do_vignette, "vw_vig.jpg")
>example("vw.jpg", :do_affine, "vw_spin.jpg")
Мы продемонстрировали методы >flip
, >rotate
, >implode
, >resize
, >annotate
и др. Результаты представлены на рис. 15.2.
Рис. 15.2. Двенадцать специальных эффектов и трансформаций
О том, какие еще существуют трансформации изображений, читайте в онлайновой документации.
15.3.3. API рисования
В RMagick имеется развитый API для рисования линий, многоугольников и различных кривых. Он поддерживает заливку, полупрозрачность, выбор цвета, шрифтов, вращение, растяжение и другие операции.
Чтобы получить представление об имеющихся возможностях, рассмотрим простой пример.
В листинге 15.9 приведена программа, которая рисует на заданном фоне сетку, а поверх нее несколько закрашенных геометрических фигур. Черно-белое изображение, получившееся в результате, показано на рис. 15.3.
>require 'RMagick'
>img = Magick::ImageList.new
>img.new_image(500, 500)
>purplish = "#ff55ff"
>yuck = "#5fff62"
>bleah = "#3333ff"
>line = Magick::Draw.new
>50.step(450,50) do |n|
> line.line(n,50, n,450) # Вертикальная прямая.
> line.draw(img)
> line.line(50,n, 450,n) # Горизонтальная прямая.
> line.draw(img)
>end
># Нарисовать круг.
>cir = Magick::Draw.new
>cir.fill(purplish)
>cir.stroke('black').stroke_width(1)
>cir.circle(250,200, 250,310)
>cir.draw(img)
>rect = Magick::Draw.new
>rect.stroke('black').stroke_width(1)
>rect.fill(yuck)
>rect.rectangle(340,380,237,110)
>rect.draw(img)
>tri = Magick::Draw.new
>tri.stroke('black').stroke_width(1)
>tri.fill(bleah)
>tri.polygon(90,320,160,370,390,120)
>tri.draw(img)
>img = img.quantize(256,Magick::GRAYColorspace)
>img.write("drawing.gif")
Рис. 15.3. Простая программа рисования
Рассмотрим эту программу подробнее. Сначала мы создаем «пустое» изображение методом ImageList.new, а потом вызываем для возвращенного объекта метод new_image. Можно считать, что мы получили «чистый холст» заданного размера (500×500 пикселей).
Для удобства определим несколько цветов с понятными именами, например >purplish
и >yuck
. Цвета определяются так же, как в HTML. Базовая библиотека xMagick сама распознает много названий цветов, например, >red
и >black
; если сомневаетесь, пробуйте или задавайте цвета в шестнадцатеричном виде.
Затем мы создаем объект рисования >line
; это объект Ruby, соответствующий графическому объекту, который мы видим на экране. Переменную иногда называют >gc
или как-то похоже (от «graphics context» — графический контекст), но нам кажется естественным употребить имя, отражающее природу объекта.
Далее вызывается метод >line
объекта рисования, по два раза на каждой итерации цикла. Взглянув на то, как изменяются координаты, вы поймете, что на каждой итерации рисуется одна горизонтальная и одна вертикальная прямая.
После каждого обращения к >line
мы вызываем метод >draw
того же объекта и передаем ему ссылку на изображение. Именно на этом шаге графический объект помещается на холст.
Лично меня обращения вида >shape.draw(image)
немного путают. В общем случае вызов любого метода выглядит так:
>big_thing.operation(little_thing)
># Например: dog.wag(tail) (собака.вилять(хвост))
Но методы RMagick записываются, скорее, в виде:
>little_thing.operation(big_thing)
># Продолжая аналогию: tail.wag(dog) (хвост.вилять(собака))
Впрочем, эта идиома достаточно распространена, особенно в программах рисования и графических интерфейсах. И в классической объектно-ориентированной идеологии это вполне оправданно: фигура знает, как нарисовать себя, а стало быть, должна иметь метод >draw
. Он же, в свою очередь, должен знать, где рисовать, поэтому ему нужно передать ссылку на холст (или что-то подобное).
Но, возможно, вас не мучает вопрос, от имени какого объекта следует вызывать метод. Тем лучше!..
Покончив с сеткой, мы переходим к рисованию фигур. Метод >circle
принимает в качестве параметров центр окружности и какую-нибудь точку на ней (радиус не передается!). Метод >rectangle
еще проще; для рисования прямоугольника нужно задать координаты левого верхнего угла (первые два параметра) и координаты правого нижнего угла (последние два параметра). Треугольник же является частным случаем многоугольника; мы задаем координаты всех его вершин, а замыкающий отрезок (из конечной точки в начальную) рисуется автоматически.
У каждого графического объекта есть еще несколько методов. Взгляните на этот «сцепленный» вызов:
>shape.stroke('black').stroke_width(1)
Это что-то вроде пера, которое рисует черными чернилами линию толщиной в один пиксель. Цвет штриха часто имеет значение, особенно если мы хотим закрасить фигуру.
Конечно, у каждой из трех этих фигур есть еще метод >fill
, при вызове которого указывается цвет заливки. (Имеются также более сложные способы заливки, например, штриховкой, с наложением тени и т.д.) Метод >fill
заменяет цвет внутренних пикселей фигуры указанным, ориентируясь на цвет границы, чтобы отличить внутреннюю часть от внешней.
API рисования содержит также методы для настройки полупрозрачности, пространственных преобразований и многого другого. Есть методы для анализа, рисования и манипулирования текстовыми строками. Существует даже специальный RVG API (Ruby Vector Graphics — векторная графика в Ruby), совместимый с рекомендацией консорциума W3C по масштабируемой векторной графике (SVG).
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.