BMP画像で特定の色になっているピクセルの座標を抽出するためのPerlスクリプト

概要
Image::BMPモジュールを活用して、BMP画像の中で特定の色になっているピクセルを抽出することができる。

解説

解析対象となった example32x32.bmp(ここに表示されているのはpngファイルに変換されたものである。)
解析対象となった example32x32.bmp [1]

Perlでは、Image::BMPモジュールでBMP画像を扱うことができる。このモジュールを使えば、BMP画像で特定の色になっているピクセルの座標をすべて抽出することができる。

例えば、以下に掲げるスクリプトは、example32x32.bmp という黒地に紫の四角が描かれたBMP画像の中から、紫になっているピクセルの座標をすべて調べ上げて、result.txt に結果を出力する。

スクリプト

use strict;
use warnings;
use utf8;

# ビットマップを扱うためのモジュール 
use Image::BMP;

# 結果を書き出すファイルの指定
my $filename = './result.txt';
open(OUT, ">$filename") or die;

# 検索したい色を16進形式で
my $search_color = "FF00FF"; # 紫色
# 16 進数を10進数に変換
$search_color = hex($search_color);

# Image::BMPオブジェクトの生成
my $img = new Image::BMP(
       file  => 'example32x32.bmp', # 開くファイル
       debug => 1 # 最低限のデバッグ情報を出力
       );

# BMPファイルの幅と高さを取得
my ($iW, $iH) = ($img->{Width}, $img->{Height});

# 結果のヘッダーの書き出し
print OUT "X\tY\n";

# BMPの全てのピクセルについて調査
for(my $iX=0; $iX<$iW; $iX++){
  for(my $iY=0 ; $iY<$iH; $iY++){
    my $color = $img->xy($iX,$iY);
    if($color == $search_color){
      print OUT $iX, "\t", $iY, "\n";
    }
  }
}

close OUT;

出力される結果

X	Y
8	10
8	11
8	12
8	13
8	14
8	15
8	16
8	17
9	10
9	11
9	12
9	13
9	14
9	15
9	16
9	17
10	10
10	11
10	12
10	13
10	14
10	15
10	16
10	17
11	10
11	11
11	12
11	13
11	14
11	15
11	16
11	17
12	10
12	11
12	12
12	13
12	14
12	15
12	16
12	17
13	10
13	11
13	12
13	13
13	14
13	15
13	16
13	17
14	10
14	11
14	12
14	13
14	14
14	15
14	16
14	17
15	10
15	11
15	12
15	13
15	14
15	15
15	16
15	17
16	10
16	11
16	12
16	13
16	14
16	15
16	16
16	17
17	10
17	11
17	12
17	13
17	14
17	15
17	16
17	17
脚注
  1. ここに表示されているのはpngファイルに変換されたものである。 []