Чтение онлайн

ЖАНРЫ

Программирование на языке Ruby
Шрифт:

В листинге 15.8 показано 12 различных эффектов. Метод

example
принимает имя файла, символ, соответствующий методу, и имя нового файла; он читает файл, вызывает метод и записывает результат в новый файл. Сами методы (скажем, do_rotate) по большей части просты — они получают изображение и вызывают его метод экземпляра (а возвращают результат трансформации).

Листинг 15.8. Двенадцать специальных эффектов и трансформаций

require 'Rmagick'

def do_flip(img)

 img.flip

end

def do_rotate(img)

 img.rotate(45)

end

def do_implode(img)

 img = img.implode(0.65)

end

def do_resize(img)

 img.resize(120,240)

end

def do_text(img)

 text = Magick::Draw.new

 text.annotate(img, 0, 0, 0, 100, "HELLO") do

self.gravity = Magick::SouthGravity

self.pointsize = 72

self.stroke = 'black'

self.fill = '#FAFAFA'

self.font_weight = Magick::BoldWeight

self.font_stretch = Magick::UltraCondensedStretch

 end

 img

end

def do_emboss(img)

 img.emboss

end

def do_spread(img)

 img.spread(10)

end

def do_motion(img)

 img.motion_blur(0,30,170)

end

def do_oil(img)

 img.oil_paint(10)

end

def do_charcoal(img)

 img.charcoal

end

def do_vignette(img)

 img.vignette

end

def do_affine(img)

 spin_xform = Magick::AffineMatrix.new(1, Math::PI/6, Math::PI/6, 1, 0, 0)

 img.affine_transform(spin_xform) #
Применить преобразование.

end

###

def example(old_file, meth, new_file)

 img = Magick::ImageList.new(old_file)

 new_img = send(meth, img)

 new_img.write(new_file)

end

example("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")

Мы

продемонстрировали методы
flip
,
rotate
,
implode
,
resize
,
annotate
и др. Результаты представлены на рис. 15.2.

Рис. 15.2. Двенадцать специальных эффектов и трансформаций

О том, какие еще существуют трансформации изображений, читайте в онлайновой документации.

15.3.3. API рисования

В RMagick имеется развитый API для рисования линий, многоугольников и различных кривых. Он поддерживает заливку, полупрозрачность, выбор цвета, шрифтов, вращение, растяжение и другие операции.

Чтобы получить представление об имеющихся возможностях, рассмотрим простой пример.

В листинге 15.9 приведена программа, которая рисует на заданном фоне сетку, а поверх нее несколько закрашенных геометрических фигур. Черно-белое изображение, получившееся в результате, показано на рис. 15.3.

Листинг 15.9. Простая программа рисования

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

Поделиться с друзьями: