Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Ruby】RMagicで画像を分割する

ひょんなことからRPGツクールVXの歩行グラフィックス(通称:歩行グラ)のトリミングを行うことになったのだけど、丁度いい手頃なツールが見当たらなかったので作ることに。

下の画像がRPGツクールVX規格の歩行グラの例です。簡単に言えばこれを12分割したいということです。

f:id:PlugOut:20180714234804p:plain

今回は説明用に「ゆらゆらドット。」様の素材を使用させて頂きました。

dotrpg.blog.fc2.com

 

今回は画像を手軽に扱いたかったので、RubyRMagicを採用することにしました。

RMagicでの画像のトリミングは本当に簡単で、単純に切り抜くだけなら以下の数行で終わります。

サンプル(Ruby) :

require 'RMagick'
original = Magick::ImageList.new("input.png") # input.pngを取り込む
image = original.crop(0, 0, 48, 80) # (x = 0px, y = 0px) を左上として(width = 48px, height = 80px)を切り取る
image.write("output.png") # output.pngとして出力する

 

実行結果 : output.png

f:id:PlugOut:20180714235423p:plain

しっかり指定サイズで切り抜かれています。

 

そんでもって今の作業を12回繰り返さなければならないので、これを汎用化した便利プログラムを作成しました。

プログラム : splitter.rb

#!/usr/bin/ruby
require 'RMagick'
require 'optparse'

file = ARGV[0]
cols = 3
rows = 4
opt = OptionParser.new
opt.on('-c', '--cols ITEM', '分割する列の数') { |v| cols = v.to_i }
opt.on('-r', '--rows ITEM', '分割する行の数') { |v| rows = v.to_i }

opt.banner += ' file'
begin
  opt.parse(ARGV)
rescue OptionParser::InvalidOption => e
  abort("無効なオプション指定が含まれています")
end

if (!file || !cols || !rows)
  abort("必要な引数が与えられていません")
end

begin
  original = Magick::ImageList.new(file)
rescue => error 
  abort("ファイルが読み込めません")
end

width = original.columns / cols #幅
height = original.rows / rows #高さ

file_parts = file.split("\.")
output_file_base_name = file_parts[0]
extension = ""
if file_parts[1]
  extension = ".#{file_parts[1]}"
end

for i in 1..cols
  for j in 1..rows
    image = original.crop(width * (i - 1), height * (j - 1), width, height)
    image.write("#{output_file_base_name}.#{i}-#{j}#{extension}")
  end 
end

使い方は単純に、ruby splitter.rb input.pngで、input.pngが12分割されます。

分割された後の名前は、「(元ファイルの拡張子以外).横x縦(元ファイルの拡張子)」になります。

またオプションで分割する列の数と行の数を指定することも可能にしてあります。

何か他に使い道あるかな?笑