Программирование на языке 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. Если вас волнует быстродействие, рекомендую провести тесты на своем компьютере, используя собственные данные.
>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) по большей части просты — они получают изображение и вызывают его метод экземпляра (а возвращают результат трансформации).
>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")
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.