M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2008年6月20日 12:51

縦長連続画像を分割してムフフ

このエントリーをはてなブックマークに追加 mixiチェック

最近のゲームは、画像読み込み用のメモリを潤沢にとれるのをいいことに、ある1シーンの画像を縦長に連ねておいたものを用意していることが多いです。表示するときに、ビューポイントを切り替えてあげることで画像が変化できるっぽい。

それだと、せっかくのムフフ画像が(ry

というわけで、以下の画像のコマを切り出して個別の画像ファイルにするPerlスクリプトです。


今回、こんなのを用意しました。

Splitimage01
▲スネーク潜入中です

ActivePerlでImage::Magickをインストール

この手の作業で定番のImageMagickを使います。

今回は、ActivePerlで作業するので、Perl Package Manager(PPM)から、Image::Magickパッケージをインストールします。昔は、Image::MagickをActivePerlで入れるのにも結構苦労していましたが、今時はこんなに楽です。スタートメニューから、「ActivePerl 5.8.x Build xxx」というグループを選ぶと、「Perl Package Manager」というのがありますので、それを起動すると下の画面のようになります。

Activeperlimagemagick
▲PPMでImage::Magick入れる

  • ①すべてのパッケージ表示にする
  • ②いっぱいありすぎるので、検索ボックスにImageと入れる
  • ③絞られたパッケージ表示の中から、Image-Magickを選ぶ
  • ④パッケージインストールマークボタンを選択
  • ⑤右矢印ボタンを選択して、インストールする

Image-Magickが2種類ありますが、トラブルさけるためには、QD=8選んでおくといいみたい

Activeperlimagemagick2
▲せっかくだから「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>

Splitimage02
▲タイムパラドックスだ!

最後に

これをするフリーソフトなどいっぱいあるような気がしますが、PerlでImageMagickでいじるともっといろいろ(いろんな意味で)できるのでやってみられるといいかなーと思います。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2508

コメントする