この記事の目次
プログラミングを使って出来る事
プログラム、プログラミングという言葉を聞いた人は多いと思うのですが、具体的にどういう事をしているかという事を知っている人は意外に少ないんじゃないでしょうか。
テレビや映画の影響で、かっこ良くアニメーションする画面に向かって、ワインを飲みながらおしゃれダンディーな男がパスワードを解析する。みたいな事をイメージする人もいるかも知れませんね。
まあそういう世界も実際にあるのかも知れませんが、僕のプログラミングの世界はもっとシンプルというか地味です。
写真をそれぞれ適当なサイズに縮小するプログラムを書きました。
最近、写真の縮小リサイズをするケースが多くなってしまいました。
というのもこのブログでは横1024ピクセルの写真を、もうひとつの写真ブログでは横写真は横1440ピクセル、縦画像は横1280ピクセルの写真を用意しているからです。
いくら1コマンドで縮小作業が出来るとはいえ、写真の内容と名前を見比べながらそれぞれのサイズに変更するとなると結構しんどい事になってきました。
という事でこれらの作業を自動化したいと考えました。
以下が作成したプログラム全文です。
#!/usr/bin/ruby
class Picture
@name
@sizex
@sizey
@isOblong
def initialize(name, sizex, sizey)
@name = name
@sizex = sizex
@sizey = sizey
checkAspect()
end
def checkAspect()
if @sizex > @sizey then
@isOblong = true
else
@isOblong = false
end
end
def dumpStatus()
puts @name
puts @sizex
puts @sizey
puts @isOblong
end
def getName()
return @name
end
def getIsOblong()
return @isOblong
end
end
class PictureMaker
@pictures
def initialize(srcarr)
@pictures = []
for src in srcarr
pic = Picture.new(getName(src), getSizeX(src), getSizeY(src))
@pictures.push(pic)
end
end
def getPictures()
return @pictures
end
def getName(src)
result = src.match("(^.+)\\s")
return result[1]
end
def getSizeX(src)
result = src.match("\\s(\\d+)x")
return result[1]
end
def getSizeY(src)
result = src.match("x(\\d+)$")
return result[1]
end
end
pics = `ls *.jpg|xargs -I@ identify @|awk '{print $1, $3}'`
strarray = pics.split("\n")
pm = PictureMaker.new(strarray)
#mkdir
cmd = "mkdir 1024; mkdir 1280; mkdir 1440;"
#resize
for pic in pm.getPictures()
if(pic.getIsOblong() == true) then
cmd += "convert -resize 1440x -unsharp 0.125x1.0+1+0.05 -quality 80 -verbose " + pic.getName() + " ./1440/" + pic.getName() + ";"
else
cmd += "convert -resize 1280x -unsharp 0.125x1.0+1+0.05 -quality 80 -verbose " + pic.getName() + " ./1280/" + pic.getName() + ";"
end
cmd += "convert -resize 1024x -unsharp 0.125x1.0+1+0.05 -quality 80 -verbose " + pic.getName() + " ./1024/" + pic.getName() + ";"
end
exec(cmd)
カメラの傾きを記録しているExifデータがなかった
通常デジタルカメラから出力される写真データには、撮影した時のカメラの傾きの情報が記録されています。
これが使えれば今回みたいな長いプログラムを書く必要はなかったんですが、デジタルカメラの写真データを現像する際にどうやら失われてしまうらしく。
仕方がないので、画像の縦横の画素数で判断しようと思いました。
プログラムがやっている事をざっと解説
2行目から37行目までで、写真の名前と画像の縦横比を対で保管してPictureというデータを作っています。
39行目から74行目で、上記のPictureというデータを作るための前準備を行っています。
具体的にいうと、元々のプログラムから得られる画像の情報は
IMG_4717.jpg 5616x3744
というような形なので、名前とサイズをそれぞれ必要な部分のみ抜き取ってPictureデータに格納する準備をしているという事です。
名前:IMG_4717.jpg サイズX:5616 サイズY:3744
といった具合にですね。
76行目から最後までは、上記に作ったプログラムを目次的に実行する場面になります。
具体的には、1024 、1280 、1440というディレクトリ(フォルダ)を作って、縦画像は1280ピクセルに、横画像は1440ピクセルに、これらを含めた全ての画像を1024ピクセルに変換してそれぞれのディレクトリに格納しています。
これにて、完成です。
1時間半くらいかかりました
傾き情報のあるなしの確認に少々時間を費やして、書き上がるまでにだいたい1時間半くらいかかりました。
しかしこれまで、全ての画像を目でみて、それぞれ縮小して、正しいディレクトリに保存する。とやっていた作業がこれからは1コマンドで出来るようになりました。
おそらく、このプログラムを書くのに要した1時間半はすぐに回収する事ができると思います。
プログラム化する事の本当の威力
このプログラムがあれば、たとえ100個のディレクトリにそれぞれ1000枚の画像が縦横混合で入っていたとしても、ちょっとだけ手を加えて実行してやればパソコンが勝手にそれぞれのサイズに正しく間違いなく変換してくれます。
写真の数が1万になっても2万になっても同様です。たった1つのコマンドを実行して待つだけ。
これが決められた作業をコンピューターによってプログラム化してしまう事の一番大きな利点です。
加えて、パソコンで出来る作業って基本的には全てプログラム化する事が可能なんですね。
普段パソコンを使ってやる事が多い!特に繰り返しの作業がとっても多い!!
という人は是非今からでもプログラミングの技術を学ばれる事をおすすめしますよ!
本日もG線上のきりんを訪れてくださってありがとうございます。
それではまた。
更新情報をお届けします




















この記事へのコメントはありません。