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の倍数になるように入っているのでそこに気を付ける必要あり。
参考にしたサイト
色を16色に減色
コンソールでは文字色はWINAPIのSetConsoleTextAttributeで確認できる16色しか表示できないです。
僕の知らないだけかもしれないですが
今回は16色のみの表示ですが背景色の16色と合わせて256色を疑似的に再現できるらしいです。
興味あれば調べてみてください。
減色の方法
あらかじめ求めていた数値とRBGの値が3次元ベクトル上で近くなるのを利用して求めます。
少し色がおかしくなるところがあるのでk-mean法とか使うともっと良くなるかもです。
参考にしたサイト
k-means法で画像を減色するサンプルコード - めもめも
CHAR_INFO型
表示に使うWriteConsoleOutput関数で使う型です。
文字情報と色の情報を入れることが出来ます。
読み込んだ情報をここにつめて表示させました。
めっちゃ参考になったサイト
日本語のサイトが少なくてつらかったです・・・
次回
BMP画像を読み込むソースとその解説を載せる予定です。
2020/12/30 追記
すいませんいま忙しく続きが書けない状況です ソースをGitHubに上げていますのでそちらを参考にしてもらえると助かります そのうち書くので・・・