2017年3月5日日曜日

[UWSC]BMP画像の幅と高さを得る関数 [自作関数]

初心者のプログラミング導入のため、簡単な自作関数を作って公開しているブログ。UWSCは“画像認識ができるということでビットマップ画像の幅と高さを取得する関数を作りました。

記事の内容

○ビットマップ画像(.bmp)の幅と高さを取得する関数

UWSCでは“画像認識”という機能が使えるそうです。
画像認識とは、「ポク太郎のアイコンを探せ!」と命令をすると「この座標にあります!」「画面上にありません!」などと判定してくれる機能です。

やり方としては、画像ファイルを用意しそのファイルのパスを指定してやることでUWSCに伝えます。その後、画像を探せと命令します。以降、画像を扱うことが多くなると思いますので、ここでは画像の幅、高さを返してくれる関数を用意しておくことにしました。画像のフォーマットは色々ありますが、認識に使うのに適している非圧縮のビットマップ(.bmp)を使います。

ビットマップ画像(.bmp)の幅と高さを取得する関数

関数の仕様とソースは、
FUNCTION bmp(path)//path:ビットマップファイルのパス
//ビットマップ画像のフォーマット
// 0,2:"BM"(ビットマップという意味)
// 2,4:ファイルサイズ
//10,4:画像データへのオフセット(色テーブル分)
//14,4:情報ヘッダーサイズ(Windows用:40,OS/2用:12)
//18,4:幅
//22,4:高さ
//28,2:色数(24bitフルカラー:24)
    dim get_wh[1]
    bin=CREATEOLEOBJ("ADODB.Stream")
    bin.Open()
    bin.Type=1
    bin.LoadFromFile(path)
    tmp_info=bin.Read(26)
    bin.Close()
  for i=18 to LENGTH(tmp_info)-1
   if i<22
    get_wh[0]=get_wh[0]+tmp_info[i]*POWER(256,i-18)
   elseif i<26
    get_wh[1]=get_wh[1]+tmp_info[i]*POWER(256,i-22)
   endif
  next
    RESULT=slice(get_wh,0,LENGTH(get_wh)-1)
FEND

呼び出し側は、
    wh=bmp("C:\poku\ポク太郎アイコン.bmp")
    width=wh[0]//幅が入る
    height=wh[1]//高さが入る

画像ファイルと呼ばれるものの中には.jpg、png、tiffなど多数あります。それぞれ特徴があり目的によって使い分けられています。ファイルの中にどういった並び方で情報が書かれているか(フォーマット)は、それぞれの画像形式で規定されています。(それぞれの画像形式を作った人がそれぞれ決めた。)

大抵は自分は何もんですよという情報がファイルの先頭(ヘッダといいます)に記録されています。その中の情報を読み取ることで幅や高さ、カラー/モノクロの判別が付きます。ヘッダ情報があまり当てにならない形式もあるのですが。

ビットマップ画像に関しても当然フォーマットが規定されており仕様として公開されています。
その仕様を上の関数内の2行目~9行目にコメントアウトしてメモってあります。
例えば6行目を例にすると、ビットマップファイルの先頭から数えて18バイト目から4バイト分が幅を言い表している部分だとメモってあります。今回は、画像の幅と高さをゲットするのが目的ですので、
      18バイト目から4バイト分を読み取って10進数にする(幅)
      22バイト目から4バイト分を読み取って10進数にする(高さ)
が仕事になります。



プログラムの説明


プログラム中にある命令・関数
11~16行目 ファイルをバイナリとして開く方法です。
14行目で画像ファイルのパスを渡して、
15行目で26バイト読み込めという命令が書いてあります。
17、23行目 for~next構文。LENGTH(配列)は配列の要素の数を返す関数。
i=18から配列の最大要素数(要素の数-1)までループせよと命令しています。
18~22行目 配列の中から目的の幅と高さを10進数に直す部分です。
i=18からループが始まりますので、
もし22より小さいなら(つまりi=18~21:“幅”なら)18行目を実行せよ
もし26より小さいなら(つまりi=22~25:“高さ”なら)19行目を実行せよ

19行目にPOWER(256,i-18)とあります。
POWER()関数は256の(i-18)乗を返す関数です。
i=18のときは、POWER(256,0)=1
i=19のときは、POWER(256,1)=256
i=20のときは、POWER(256,2)=65536
i=21のときは、POWER(256,3)=1600万

BMP画像は幅と高さを記録するのに4バイト分(16進数の2桁を4つ)確保しています。
その4バイト分を10進数に直すには、
1番下の1バイトx1+2番目x256+3番目x65536+4番目x1600万
19行目はその計算をしています。21行目も同じ。
この部分がよく分からない場合は、こことかこことかここを参照してみてください。
24行目 SLICE(配列、開始要素番号、終了要素番号)
配列の中を指定範囲の配列で返す関数です。


ここでは幅と高さを取得しましたが、カラーの画像かモノクロの画像かを判定したい場合には、for~next間のif文に条件を付け加えて同じように取得することができます。

記事の内容

記事の内容は伝わりましたでしょうか。
○ビットマップ画像(.bmp)の幅と高さを取得する関数



関数群のダウンロードはこちら
func_poku.uwsのコメント欄に呼び出し方が書いてあります。


【関連記事】  [UWSC]指定画像が表示された座標を返す関数
[UWSC]配列変数と関数
[UWSC]ファイル操作の関数
[UWSC]日付時刻を文字列で返す関数

ビットマップ画像の幅と高さ

UWSC自作関数解説


スポンサーリンク



blogramのブログランキング

目次
コンピュータ(ハード/ソフト) 映画・ドラマ・芸能 変人のつぶやきとトラブル
ホームへ戻る ページ上部へ


0 件のコメント:

コメントを投稿