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印刷できるフリーソフトとかを探すか、写真管理ソフトの機能でナントカしようとしますね。