Python版图片合成脚本

Oct/13/2011 update script: remove urgly lambda, use os.path.splitext()

之前写过用Ruby+ImageMagick整合多张图片,因为现在转用python,所以又用python写了一个。

当然,这个脚本的前提也是需要安装ImageMagick,而且要把它的bin目录加到PATH里面。也就是说在命令行下面输入montage不会提示找不到程序。另外,你还要装Python环境。。。

这次写的Python版比较简单,没有写Usage,这里提一下:

把脚本文件搁到你要整合图片的目录,然后执行脚本。该目录所有图片就合成一个叫result.png的文件了。

运行时会提示用哪种方式连接。默认的是普通的拼接。那个photostyle是相册风格的,具体的自己试下就行了。

代码如下:

import os
imgTypes=('.jpg','jpeg','.png','.gif')
#isImg= lambda x: x.find('.') >0 and x.split('.')[1] in imgTypes
#imgFiles=[f for f in os.listdir(os.getcwd()) if isImg(f) and f.find('result') < 0]
imgFiles=[f for f in os.listdir(os.getcwd()) if os.path.splitext(f)[1].lower() in imgTypes and f.find('result') < 0]
imgStrings=reduce(lambda x,y: '%s %s'%(x,y), imgFiles)

photoStyle='montage %s -auto-orient -bordercolor Lavender -background white +polaroid -tile 1x -gravity center -background SkyBlue  -geometry "1x1<" result.jpg'%imgStrings
plainStyle='montage %s -tile 1x -geometry "1x1<" result.jpg'%imgStrings
choice=raw_input("1. default: plain\t2. photo style\nplz choose image merge type:")
if choice == '' or choice == '1':
    os.system(plainStyle)
else:
    os.system(photoStyle)

样图:

PhotoStyle:               PlainStyle:

otostyleotostyle

Advertisements

用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}`

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