じゅぴの記録帳

いったイベントや勉強したこと等を記録するブログです 間違ってるとこあれば指摘お願いします

c言語でBMP画像を読み書きする①

環境

visual studio 2017

概要

8bitと24bitのBMP画像をC言語のfread等で読み込んでコンソールで読み書きする方法のメモです。
読み込み、表示するのにめっちゃ苦労したので誰かの参考になればいいなと思い書きました!
読み込み、表示をそれぞれ2回に分けて書こうと思ってます。
今回書くのはBMP画像の読み込む内容と色を16色に分類する方法、描写に使うCHAR_INFO型についてです。  
ソースはよって人は読み飛ばしてください。
間違いがあったら教えてください。

BMP表示に必要な情報

BMP画像はいくつかの構造で成り立ってますが必要なものは少ないです。

  • ファイルヘッダ

    ファイルヘッダは2種類ありますが必要な情報のあるアドレスは変わらないのであんまり関係ないです。

アドレス サイズ 内容
0x000a(10) 4バイト ファイルヘッダからが情報までの距離
  • 情報ヘッダ

    情報ヘッダはいくつか種類があり大まかに2種類あります。

    情報ヘッダのサイズで分類できますがヘッダサイズが12バイトのほうはカラーパレットが

    めんどくさいので省きます。

アドレス サイズ 内容
0x000e(14) 4バイト 情報ヘッダのサイズ
0x0012(18) 4バイト 画像の横
0x0016(22) 4バイト 画像の縦
0x001c(28) 2バイト 何ビットの画像か入ってるか
0x002e(46) 4バイト カラーパレットに入っている色数 0の場合がある
  • カラーパレット

    1~8バイトのとき存在し、使用されている色のRGBが入る。
    これを画像データで指定して色を選ぶ仕組みになっている。
    1~8バイト以外は画像データのところに直で色の情報が入っている。
    色数が0のときはビット数が最大色数になるらしい。

  • 画像データ

    色の情報かカラーパレットのどの色を使用するか入っている。
    左下から右上に向かって情報が入っていてそれをよみこみます
    なんで下から・・・
    横のデータが4の倍数になるように入っているのでそこに気を付ける必要あり。

参考にしたサイト

Windows bitmap - ウィキペディア

BMP ファイルフォーマット

Bitmapファイルを入出力してみる-[物理のかぎしっぽ]

C言語で24ビットBMP画像を読み込み加工する

色を16色に減色

コンソールでは文字色はWINAPIのSetConsoleTextAttributeで確認できる16色しか表示できないです。

僕の知らないだけかもしれないですが

今回は16色のみの表示ですが背景色の16色と合わせて256色を疑似的に再現できるらしいです。

興味あれば調べてみてください。

減色の方法

あらかじめ求めていた数値とRBGの値が3次元ベクトル上で近くなるのを利用して求めます。

少し色がおかしくなるところがあるのでk-mean法とか使うともっと良くなるかもです。

参考にしたサイト

減色アルゴリズム[量子化/メディアンカット/k平均法]

k-means法で画像を減色するサンプルコード - めもめも

CHAR_INFO型

表示に使うWriteConsoleOutput関数で使う型です。

文字情報と色の情報を入れることが出来ます。

読み込んだ情報をここにつめて表示させました。

めっちゃ参考になったサイト

コンソールゲーム制作 第1章 描画(3) - Qiita

日本語のサイトが少なくてつらかったです・・・

次回

BMP画像を読み込むソースとその解説を載せる予定です。

2020/12/30 追記

すいませんいま忙しく続きが書けない状況です ソースをGitHubに上げていますのでそちらを参考にしてもらえると助かります そのうち書くので・・・

github.com