MiniMagick文档

浏览:2766 发布日期:2016-09-29 10:25:33

用法

让我们先来看看调整图形大小的方法:

image = MiniMagick::Image.open("input.jpg")
image.path #=> "/var/folders/k7/6zx6dx6x7ys3rv3srh0nyfj00000gn/T/magick20140921-75881-1yho3zc.jpg"
image.resize "100x100"
image.format "png"
image.write "output.png"

Mini::Image.open获得图像的副本,并可以进一步修改该副本(原始文件保持不变)。然后,我们调整图像大小,并将其写入一个文件中,写入部分是必要的,因为副本是暂时的,当引用丢失,它会被垃圾回收。

MiniMagick::Image.open同样可以访问url.

image = MiniMagick::Image.open("http://example.com/image.jpg")
image.contrast
image.write("from_internets.jpg")

另一方面,如果我们要对原始图像进行修改,我们可以用MiniMagick::Image.new。

image = MiniMagick::Image.new("input.jpg")
image.path #=> "input.jpg"
image.resize "100x100"
# No calling #write, because it's no a copy

组合选项

直接使用#resize方法直接方便,如果我们调用很多方法,则很快变得低效。MiniMagick::Image#combine_options使用多个选项,在一个命令中:

image.combine_options do |b|
  b.resize "250x200>"
  b.rotate "-90"
  b.flip
end # the command gets executed

更简洁的方法,MiniMagick::Image.new同样能够通过一个块使用combine_options:

image = MiniMagick::Image.new("input.jpg") do |b|
  b.resize "250x200>"
  b.rotate "-90"
  b.flip
end # the command gets executed

这个yield是MiniMatick::Tool::Mogrify。关于此实例的更多信息,见Metal 下面。

属性

一个MiniMagick::Image有很多方便的属性:

image.type        #=> "JPEG"
image.mime_type   #=> "image/jpeg"
image.width       #=> 250
image.height      #=> 300
image.dimensions  #=> [250, 300]
image.size        #=> 3451 (in bytes)
image.colorspace  #=> "DirectClass sRGB"
image.exif        #=> {"DateTimeOriginal" => "2013:09:04 08:03:39", ...}
image.resolution  #=> [75, 75]
image.signature   #=> "60a7848c4ca6e36b8e2c5dea632ecdc29e9637791d2c59ebf7a54c0c6a74ef7e"

如果你需要更多的额控制,你还可以访问原始图像属性:

image["%[gamma]"] # "0.9"

要获取所有属性,MiniMagick同样提供一个方法(通过指定--verbose到一个hash)

image.details #=> {"Format" => "JPEG", "Mime type" => "image/jpeg", "Resolution" => "300x300", ...}

配置

MiniMagick.configure do |config|
  config.cli = :graphicsmagick
  config.timeout = 5
end

可以查看Configuration,查看所有选项。

合成

MiniMagick同样允许您合成图像:

first_image  = MiniMagick::Image.new("first.jpg")
second_image = MiniMagick::Image.new("second.jpg")
result = first_image.composite(second_image) do |c|
  c.compose "Over"    # OverCompositeOp
  c.geometry "+20+20" # copy second_image onto first_image from (20, 20)
end
result.write "output.jpg"

图层/帧/页

对于多层次图像,你可以访问它的图层。

gif.frames #=> [...]
pdf.pages  #=> [...]
psd.layers #=> [...]

gif.frames.each_with_index do |frame, idx|
  frame.write("frame#{idx}.jpg")
end

图片验证

默认情况下,MiniMagick验证图像,每次打开它们。它通过运行识别它们,看看ImageMagick验证有效性。这增加了少量开销。有时,它是安全的假设,所有的输入和输出图像是有效的默认和关闭验证:

MiniMagick.configure do |config|
  config.validate_on_create = false
  config.validate_on_write = false
end

你可以测试图像是不是有效:

image.valid?
image.validate! # raises MiniMagick::Invalid if image is invalid

调试

当出现问题,可以设置调试模式:

MiniMagick.configure do |config|
  config.debug = true
end

在这种模式下,每一个命令,在shell执行时将被写入标准输出:

切换图像接口

默认接口为ImageMagick,不过你可以指定使用GraphicsMagick:

MiniMagick.configure do |config|
  config.cli = :graphicsmagick
end

如果你是一个真正的大师,你可能想要使用GraphicsMagick只对某些部分进行处理(因为它的效率更高),反之亦然。你可以使用with_cli:

MiniMagick.with_cli(:graphicsmagick) do
  # Some processing that GraphicsMagick is better at
end

警告: 如果你正在构建一个多线程的web应用程序,你应该仅在应用启动时该变图像接口。这项配置是全球性的,所以如果你在控制器中改变它,同一进程中其他线程也会有变化,这可能导致竞争条件。

Metal

你可以使用ImageMatics类似的命令直接改变:

MiniMagick::Tool::Mogrify.new do |mogrify|
  mogrify.resize("100x100")
  mogrify.negate
  mogrify << "image.jpg"
end #=> `mogrify -resize 100x100 -negate image.jpg`

# OR

mogrify = MiniMagick::Tool::Mogrify.new
mogrify.resize("100x100")
mogrify.negate
mogrify << "image.jpg"
mogrify.call #=> `mogrify -resize 100x100 -negate image.jpg`

如果你想发挥图像处理的最大性能,推荐这么做。

追加

构建命令的最基本方法是追加字符串:

MiniMagick::Tool::Convert.new do |convert|
  convert << "input.jpg"
  convert.merge! ["-resize", "500x500", "-negate"]
  convert << "output.jpg"
end

要注意的是,每一个添加的命令都要以<< 连接。

# 正确
convert << "-resize" << "500x500"

# 错误
convert << "-resize 500x500"

shell转义为您处理,如果选项有一个值,它有空格,将把它当作普通字符串:

convert << "-distort"
convert << "Perspective"
convert << "0,0,0,0 0,45,0,45 69,0,60,10 69,45,60,35"

convert -distort Perspective '0,0,0,0 0,45,0,45 69,0,60,10 69,45,60,35'

方法

你可以使用Ruby方法,而不是直接选项:

convert.resize("500x500")
convert.rotate(90)
convert.distort("Perspective", "0,0,0,0 0,45,0,45 69,0,60,10 69,45,60,35")

MiniMagick知道每个tool有什么选项,如果你错了,将会抛出NoMethodError异常。

链式调用

每个方法调用返回自身,这样就可以使用链式调用:

MiniMagick::Tool::Convert.new do |convert|
  convert << "input.jpg"
  convert.clone(0).background('gray').shadow('80x5+5+5')
  convert.negate
  convert << "output.jpg"
end

“+”选项

MiniMagick::Tool::Convert.new do |convert|
  convert << "input.jpg"
  convert.repage.+
  convert.distort.+("Perspective", "more args")
end

convert input.jpg +repage +distort Perspective 'more args'

MiniMagick::Tool::Convert.new do |convert|
  convert << "wand.gif"
  convert.stack do |stack|
    stack << "wand.gif"
    stack.rotate(30)
  end
  convert << "images.gif"
end

convert wand.gif \( wand.gif -rotate 90 \) images.gif

故障排除

当不应该的异常抛出

ImageMagick有时返回一个非零的退出代码,ImageMagick的返回非零退出代码当命令居然跑到确定在这些情况下,以避免引发错误,您可以添加以下配置:

MiniMagick.configure do |config|
  config.whiny = false
end

如果你使用metal版本,你可以传递whiny值到构造函数:

MiniMagick::Tool::Identify.new(false) do |b|
  b.help
end

Errno::ENOMEM

它可能发生,具有非常大的图片的时候,流程运行的内存,并且errno:: ENOMEM在代码中长大。在这种情况下尝试安装POSIX的产卵的宝石,并告诉MiniMagick执行shell的时候使用它命令。

MiniMagick.configure do |config|
  config.shell_api = "posix-spawn"
end