Unknown Region

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

【Ruby】RMagickで画像を一括リサイズ

大量の画像を一気に同一サイズにリサイズしたいときってありますよね。

僕も前にある大量のサムネイル画像をブログに掲載する際にそれが必要になり、いろんなツールを試した記憶があります。

今回はRubyでRMagickを使った一括リサイズ処理を書いたのでこちらに載せておきます。

あ、RMagickが動作する環境が必要なので注意してくださいね。

 

コード: resizer.rb

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

input = "./input"
output = "./output"
scale = 1.0
width = 0
height = 0
opt = OptionParser.new
opt.on('-w', '--width VALUE', 'リサイズする横幅(px)') { |v| width = v.to_i }
opt.on('-f', '--height VALUE', 'リサイズする縦幅(px)') { |v| height = v.to_i }
opt.on('-s', '--scale VALUE', '倍率') { |v| scale = v.to_f }
opt.on('-i', '--input DIR OR FILE', '処理対象のディレクトリ') { |v| input = v.to_s }
opt.on('-o', '--output DIR', '出力先のディレクトリ') { |v| output = v.to_s }

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

files = []
if FileTest.directory? input
  files = Dir.glob(input + "/*")
elsif FileTest.file? input
  files[0] = input
else
  abort "無効なinput指定です.[ input = #{input} ]"
end

# 出力先がなければ作成
unless FileTest.directory? output
  Dir.mkdir(output, 0755)
end

files.each do |file|
  begin
    original = Magick::ImageList.new(file)
  rescue => error 
    puts "ファイルを読み込めないためスキップ.[ file = #{file} ]"
    next
  end

  # 倍率指定をもとにwidthとheightを決定
  if scale
    resizedWidth = (original.columns * scale).to_i
    resizedHeight = (original.rows * scale).to_i
  end
  if width != 0
    resizedWidth = width.to_i
  end
  if height != 0
    resizedHeight = height.to_i
  end
  if resizedWidth == 0 or resizedHeight == 0
    puts "サイズ指定が不正なためスキップ.[ file = #{file}, width = #{width}, height = #{height}, scale = #{scale} ]"
    next
  end
  image = original.scale(resizedWidth, resizedHeight)

  file_parts = file.split("/")
  image.write("#{output}/#{file_parts.last}")
end

 

使い方:(widthとheightを指定)

以下のようにして入力元、出力先、サイズを指定して実行します。

ruby resizer.rb -i ./input -o ./output -w 320 -h 240

これでinputディレクトリ配下の画像ファイルが320x240にリサイズされてoutputディレクトリに出力されます。

アスペクト比は維持されないので注意して下さい。

(アスペクト比を維持したい場合は、original.scaleの行をoriginal.resizeへ変更すると良いです)

 

使い方:(scaleを指定)

ruby resizer.rb -i ./input -o ./output -w 0.5

これでinputディレクトリ配下の画像ファイルが元のサイズの縦横それぞれ0.5倍にリサイズされてoutputディレクトリに出力されます。

 

注意

-i(--input)、及び-o(--output)を省略した場合はデフォルトでそれぞれ./inputと./outputが指定されます。

-i(--input)に指定したディレクトリが存在しない場合は、エラーになります。

-o(--output)に指定したディレクトリが存在しない場合は、新たに生成します。

 

【Android】TextView.getTextSize()の落とし穴

AndroidのTextViewでsetTextSize(size)をした後にgetTextView()を実行すると値が違うという罠にハマる。

どういうことかというと、以下のコードで説明すると……。 

例: (Java)

TextView textView = new TextView(context);
textView.setTextSize(14.0f); // 14.0fを設定する
Log.d(TAG, Float.toString(textView.getTextSize())); // 36.75が取得される

setTextSize(size)はSPで値を設定するのに対して、textView.getTextSize()はピクセルで値を返却するというオチ。

すごく分かりにくいよ...orz

SPのまま取得したければ、ピクセルの値とSPの値の変換処理を書けばOK!

setTextSize(unit, size)を使えば設定も取得もピクセル値で統一できますが、端末依存の影響をモロにウケるので全くオススメしません。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)