Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
new_img = send(meth, img) new_img.write(new_file)endexample("smallpic.jpg", :do_flip, "flipped.jpg")example("smallpic.jpg", :do_rotate, "rotated.jpg")example("smallpic.jpg", :do_resize, "resized.jpg")example("smallpic.jpg", :do_implode, "imploded.jpg")example("smallpic.jpg", :do_text, "withtext.jpg")example("smallpic.jpg", :do_emboss, "embossed.jpg")example("vw.jpg", :do_spread, "vw_spread.jpg")example("vw.jpg", :do_motion, "vw_motion.jpg")example("vw.jpg", :do_oil, "vw_oil.jpg")example("vw.jpg", :do_charcoal, "vw_char.jpg")example("vw.jpg", :do_vignette, "vw_vig.jpg")example("vw.jpg", :do_affine, "vw_spin.jpg")Мы продемонстрировали методы
fliprotateimploderesizeannotate
Рис. 15.2. Двенадцать специальных эффектов и трансформаций
О том, какие еще существуют трансформации изображений, читайте в онлайновой документации.
15.3.3. API рисования
В RMagick имеется развитый API для рисования линий, многоугольников и различных кривых. Он поддерживает заливку, полупрозрачность, выбор цвета, шрифтов, вращение, растяжение и другие операции.
Чтобы получить представление об имеющихся возможностях, рассмотрим простой пример.
В листинге 15.9 приведена программа, которая рисует на заданном фоне сетку, а поверх нее несколько закрашенных геометрических фигур. Черно-белое изображение, получившееся в результате, показано на рис. 15.3.
require 'RMagick'img = Magick::ImageList.newimg.new_image(500, 500)purplish = "#ff55ff"yuck = "#5fff62"bleah = "#3333ff"line = Magick::Draw.new50.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.newcir.fill(purplish)cir.stroke('black').stroke_width(1)cir.circle(250,200, 250,310)cir.draw(img)rect = Magick::Draw.newrect.stroke('black').stroke_width(1)rect.fill(yuck)rect.rectangle(340,380,237,110)rect.draw(img)tri = Magick::Draw.newtri.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 пикселей).
Для удобства определим несколько цветов с понятными именами, например
purplishyuckredblackЗатем мы создаем объект рисования
linegcДалее вызывается метод
lineПосле каждого обращения к
linedrawЛично меня обращения вида
shape.draw(image)big_thing.operation(little_thing)# Например: dog.wag(tail) (собака.вилять(хвост))Но методы RMagick записываются, скорее, в виде:
little_thing.operation(big_thing)# Продолжая аналогию: tail.wag(dog) (хвост.вилять(собака))Впрочем, эта идиома достаточно распространена, особенно в программах рисования и графических интерфейсах. И в классической объектно-ориентированной идеологии это вполне оправданно: фигура знает, как нарисовать себя, а стало быть, должна иметь метод
draw
