縦長連続画像を分割してムフフ
スポンサードリンク
最近のゲームは、画像読み込み用のメモリを潤沢にとれるのをいいことに、ある1シーンの画像を縦長に連ねておいたものを用意していることが多いです。表示するときに、ビューポイントを切り替えてあげることで画像が変化できるっぽい。
それだと、せっかくのムフフ画像が(ry
というわけで、以下の画像のコマを切り出して個別の画像ファイルにするPerlスクリプトです。
今回、こんなのを用意しました。
▲スネーク潜入中です
ActivePerlでImage::Magickをインストール
この手の作業で定番のImageMagickを使います。
今回は、ActivePerlで作業するので、Perl Package Manager(PPM)から、Image::Magickパッケージをインストールします。昔は、Image::MagickをActivePerlで入れるのにも結構苦労していましたが、今時はこんなに楽です。スタートメニューから、「ActivePerl 5.8.x Build xxx」というグループを選ぶと、「Perl Package Manager」というのがありますので、それを起動すると下の画面のようになります。
- ①すべてのパッケージ表示にする
- ②いっぱいありすぎるので、検索ボックスにImageと入れる
- ③絞られたパッケージ表示の中から、Image-Magickを選ぶ
- ④パッケージインストールマークボタンを選択
- ⑤右矢印ボタンを選択して、インストールする
Image-Magickが2種類ありますが、トラブルさけるためには、QD=8選んでおくといいみたい。
▲せっかくだから「OK」を選びます
これで、Image::Magickモジュールが入ります。ちなみに、PPMの下の方に、インストール状況が表示されますので、そこでインストールが完了したかどうか確認してください。
プログラム
今回は、画像の一コマの大きさが800x600であることを前提に作ってみました。画像によって適宜変えてね。
Filename: split_image.pl
#!/usr/bin/perl # Filename: split_image.pl # 800x600の画像に切り出します use strict; use warnings; use Image::Magick; use File::Basename; our $frame_width = 800; our $frame_height = 600; # via http://memo.hirosiki.jp/article/40957443.html my @files; # Extract Windows' wild cards while ( my $i = shift @ARGV ) { push( @files, glob( $i ) ); } # main foreach ( @files ){ my $filename = $_; print "$filename\n"; if ( -e $filename ) { cut_img( $filename ); } } exit; sub cut_img { my $filename = shift; our ( $frame_width, $frame_height ); my $img_orig = Image::Magick->new; $img_orig->Read( $filename ); # via http://www.ss.iij4u.or.jp/~somali/web/im_example/get.html my ($width, $height) = $img_orig->Get('width', 'height'); my $frame = $height / $frame_height; if ( $frame > 1 ) { for ( my $i = 0; $i < $frame; $i++ ) { my $img = $img_orig->Clone(); # via http://www.ss.iij4u.or.jp/~somali/web/im_example/crop.html $img->Crop( width => $frame_width, height => $frame_height, x => 0, y => $frame_height * $i, ); $img->write( make_filename( $filename, $i ) ); undef $img; } } undef $img_orig; return; } sub make_filename { my $path = shift; my $num = shift; my ($filename, $directories, $suffix) = fileparse($path, qr/\.[^.]*/ ); return "$directories${filename}_$num$suffix"; } __END__
実行例:
D:\SOLID_SNAKE>split_image.pl snake.png snake.png D:\SOLID_SNAKE>
▲タイムパラドックスだ!
最後に
これをするフリーソフトなどいっぱいあるような気がしますが、PerlでImageMagickでいじるともっといろいろ(いろんな意味で)できるのでやってみられるといいかなーと思います。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2508
コメントする