SVX日記
2014-08-08(Fri) エンジニヤの宿題(の手伝い)
先日の鉄塔探検の結果をまとめなければならないのだが、えらい枚数の写真を取ったもんで、写真屋でプリントしてもらうのは鉄塔の写真だけ、とちょっとケチってしまった。
そうなると、鉄塔の看板の写真ほかは、おウチのプリンタで印刷しなければならんのだが、そう大きくプリントする必要はなく、また、1枚ずつプリントするのも面倒かつ無駄なので、ここは「n in one印刷」をすべき状況……しかし、GIMPほか、まともに写真を印刷できるアプリにそのような機能はない(はず)。
早速、以前に作ったGoogleMapをつなげるスクリプトが役に立って、鉄塔地図もサクっと作ることもできた。
#!/usr/bin/env ruby
# coding: utf-8
# A4: 210 x 297 mm (300dpi)
# x = 210; need_x = (x * 300 / 25.4).to_i
# y = 297; need_y = (y * 300 / 25.4).to_i
# d = 1; (4..8).each {|a|
# puts '# A%s: %3d x %3d mm, %4d x %4d dot (%2d in one)' % [a, x / (it = Math.sqrt(d)), y / it, need_x / it, need_y / it, d]; d *= 2
# }
# A4: 210 x 297 mm, 2480 x 3507 dot ( 1 in one)
# A5: 148 x 210 mm, 1753 x 2479 dot ( 2 in one)
# A6: 105 x 148 mm, 1240 x 1753 dot ( 4 in one)
# L: 89 x 127 mm
# A7: 74 x 105 mm, 876 x 1239 dot ( 8 in one)
# A8: 52 x 74 mm, 620 x 876 dot (16 in one)
require 'RMagick' # http://www.simplesystems.org/RMagick/doc/index.html
if(ARGV.size == 0)
abort(<<USAGE)
Usage: n_in_one dir_name
USAGE
end
max_x = 4; max_y = 4; pad = 64; result_suffix = '_n_in_one.jpg'; dummy_file = nil
files = []; Dir.open(ARGV[0]).each {|f|
f =~ /^\./ or files << f
}; files.sort!
while(files.size > 0)
dummy_file ||= files[0]
result_file = target_file = nil
yimages = Magick::ImageList.new; (0...max_y).each {|y|
ximages = Magick::ImageList.new; (0...max_x).each {|x|
p (target_file = files.shift || dummy_file)
result_file ||= target_file
ximages << Magick::Image.read(ARGV[0] + '/' + target_file)[0]
ximages.last.columns > ximages.last.rows and ximages.last.rotate!(90)
ximages.new_image(pad, pad) if(pad and x != max_x - 1)
}
yimages << ximages.append(vert = false)
yimages.new_image(pad, pad) if(pad and y != max_y - 1)
}
yimages.append(vert = true).write(result_file + result_suffix)
end
__END__
エンジニヤじゃない逸般人はn-in-one印刷できるフリーソフトとかを探すか、写真管理ソフトの機能でナントカしようとしますね。