用Ruby+ImageMagick整合多张图片

嗯,其实这个的起因是新浪微博只能贴一张图片。然后又有很多人整合了贴上去,所以我也想试试:P

直接用RMagick应该是可以直接做的,但是考虑到RMagick的方法太过复杂,所以使用了这么个组合方式。其实RMagick就是ImageMagick的ruby实现罢了。

言归正传:非常简单的代码,不过俺还是写了好久,Ruby的方法还是不熟悉呃,每次写都需要看RubyDoc。。。

使用方法:把脚本扔到一堆图片(支持jpg,png,gif)的文件夹里面,双击运行,搞定;或者在脚本后面加需要处理的图片的路径。最后会生成一个result.jpg文件。

TODO:

  • 考虑是否需要按图片尺寸来从小到大排列;如果图片太大就转换所有图片到差不多尺寸,然后从小到大排列……
  • 用RMagick重写该脚本
  • 既然是TO-DO,就看以后有心情弄不了
require 'pathname'
dir=nil
file_str=""

def usage
  puts "Usage: #{__FILE__} [path_with_image_files]"
  puts "Example 1: #{__FILE__}"
  puts "Example 2: #{__FILE__} D:\\funimg"
end

if ARGV.length ==0
  dir= Pathname.new(File.dirname(__FILE__)).realpath
  Dir.chdir(dir)
elsif ARGV.length ==1
  dir=ARGV.first
  begin
    Dir.chdir dir
  rescue Errno::ENOENT
    puts "Cannot find the directory you specified!"
    usage
    exit 1
  end
else
  usage
  exit 1
end

Dir.glob("*.{jpeg,jpg,png,gif}") do |fn|
  basename=fn.split('.')[0]
  extname= File.extname(fn)
  if extname != 'png'
    `convert #{fn} -quality 100 #{basename}.png`
    File.delete(fn)
  end
  file_str << "#{basename}.png "
end

#start to append all images
`convert #{file_str} -gravity Center -quality 80 -append result.jpg`

Update: 其实用ImageMagick的montage命令更好用:

`montage #{file_str} -auto-orient -bordercolor Lavender -background black +polaroid -tile 1x -gravity center -background SkyBlue  -geometry "1x1<" #{result_img}`

或者

`montage #{file_str} -tile 1x -geometry "1x1<" #{result_img}`

都不错。可以自己试试效果。第一个是相册风格的,第二个是直接拼接的。

Advertisements

One thought on “用Ruby+ImageMagick整合多张图片

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s