Программирование на языке Ruby - [185]

Шрифт
Интервал

). Для чтения файла можно также воспользоваться методом >Magick::ImageList.new.

У объекта, представляющего изображение, есть ряд методов чтения: >format (название формата изображения), >filesize, >depth и другие. Не так очевидно, что для получения ширины и высоты изображения служат методы >columns и >rows соответственно (поскольку изображение представляется в виде прямоугольной таблицы пикселей). Разрешение представляется двумя числами, так как может быть разным по вертикали и горизонтали.

Можно получить и другие метаданные об изображении. Подробнее об этом вы можете прочитать в онлайновой документации по RMagick.

Часто возникает необходимость перевести изображение из одного формата в другой. В RMagick это проще всего сделать, прочитав изображение из файла в одном из поддерживаемых форматов и записав его в другой файл. Новый формат определяется расширением имени файла. Понятно, что «за кулисами» при этом происходит преобразование данных. Пример:

>img = Magick::Image.read("smallpic.jpg")

>img.write("smallpic.gif") # Преобразовать в формат GIF.

Иногда нужно изменить размер изображения (сделать его больше или меньше). Для этого обычно применяется один из четырех методов: >thumbnail, >resize, >sample и >scale. Все они принимают либо число с плавающей точкой (коэффициент масштабирования), либо два числа (новые размеры в пикселях). Различия между этими методами продемонстрированы в листинге 15.7. Если вас волнует быстродействие, рекомендую провести тесты на своем компьютере, используя собственные данные.

Листинг 15.7. Четыре способа масштабирования изображения

>require 'RMagick'


>img = Magick::ImageList.new("vw.jpg")


># Все эти методы могут принимать либо один параметр - коэффициент

># масштабирования, либо два - ширину и высоту.


># Метод thumbnail самый быстрый, особенно если нужно получить очень

># маленькое изображение.

>pic1 = img.thumbnail(0.2)   # Уменьшить до 20%.

>pic2 = img.thumbnail(64,48) # Новый размер - 64x48 пикселей.


># resize работает со средней скоростью. Если заданы третий и четвертый

># параметры, то они интерпретируются как фильтр и размывание

># соответственно. По умолчанию подразумевается фильтр LanczosFilter

># и коэффициент размывания 1.0.


>pic3 = img.resize(0.40)     # Уменьшить до 40%.

>pic4 = img.resize(320,240)  # Новый размер - 320x240.

>pic5 = img.resize(300,200,Magick::LanczosFilter,0.92)


># Метод sample также имеет среднее быстродействие (и не выполняет

># интерполяцию цветов).


>pic6 = img.sample(0.35)     # Уменьшить до 35%.

>pic7 = img.sample(320,240)  # Новый размер - 320x240.


># Метод scale в моих тестах оказался самым медленным.


>pic8 = img.scale(0.60)      # Уменьшить до 60%.

>pic9 = img.scale(400,300)   # Новый размер - 400x300.

Изображения можно подвергать и многим другим трансформациям. Некоторые просты и понятны, другие гораздо сложнее. В следующем разделе мы рассмотрим несколько интересных трансформаций и специальных эффектов.

15.3.2. Специальные эффекты и трансформации

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

В листинге 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")


Рекомендуем почитать
Графика DirectX в Delphi

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.