У объекта, представляющего изображение, есть ряд методов чтения: 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
Читать дальше
Конец ознакомительного отрывка
Купить книгу