じゅぴの記録帳

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

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

c,c++のコメントメモ(doxygenを使用)

この記事ははてなをメインにQrunch(閉鎖済み)、Crieitにクロス投稿しています

環境

VisualStudio2017

VisualStudio2019

VSCode

Doxygenで生成したドキュメントのどこで表示されるかわからない

変数等の@briefは詳解の前の簡単な説明と詳解の後のところに表示。
@detailsは詳解のところに表示される。

コメントの書く場所をどうすべきか

VisualStudioではcppに書いたときInteliSenseが機能しなかったので
ヘッダーに書くのが良さそうです。
ただテンプレート関数をクラス内で多用するとコメントと合わせかなり行数が増えるので注意が必要です。
どうにかしたい・・・

前置簡易コメント

/// コメント
/// @detailsと同じ扱いに
int i;

/// コメント

このコメントはvisualstudioで使うとxmlコメントの書き方に被るみたいで
InteliSense(変数や関数を選んだときに表示されるやつ)に表示されません。
なので以下を使用しました。

//! コメント

//!@brief   説明

後置コメント

int a;///<コメント

これもvisualstudioでは「XMLコメントに無効なXMLが含まれます」と表示されるので

int a//!<コメント

を使用しました。
あと、Visual studioc++用のxmlコメントは拡張機能で使用可能みたいです。

[VisualStudio]C++でもXMLドキュメントコメントを自動挿入したい!!

各ファイルのコメント

一番始めにいります。
最低限この2行あれば十分っぽいです。

/*!
@file    何も書かなくてもいい
@brief   このファイルの説明を書く ファイル一覧のところに出力されます
*/

変数、マクロのコメント

int hp;//!@brief コメント

//!@brief     コメント
//!@details   コメント
int mp;

基本後置コメントがスマートでいいのですが複数行に対応してないみたいなので
複数行に書く場合は前置のほうがいいです。

関数のコメント

/*!
@brief 関数の要約
@param 引数名 引数の詳細引数の個数分かく
@return 戻り値の詳細
@details 関数の細かい説明
*/

クラス、列挙体へのコメント

/*!
@brief 要約 クラスなら一覧にも書かれます
@details 細かい説明
*/

便利なコメント

@todo 書くとTODOリストが自動で作成されめっちゃ便利!
@see 参照したい関数、変数を書ける
@note メモを書ける
@n 文の途中で改行してくれます。
@retval @returnの代わりに使用 戻り値ごとの細かい説明を書ける。

参考にしたサイト

Doxygen コマンド一覧
C++で///を使ったコメント - teratail

VSCode拡張機能(2020-11-25追記)

VSCodeにはDoxygen形式のコメントを自動生成してくれるとても便利な拡張機能があります
Doxygen Documentation Generator
関数やクラスの前、ファイルの先頭で/**と改行だけで必要な内容を生成できるのでとてもおすすめです。

マジカルミライ2018 in OSAKA 感想

4年ぶりに関西で開催されるマジカルミライに参加して来ました!

マジカルミライは今回が初参加でした!

 

※以下ネタバレ含むかもです

 

f:id:jupiteru:20180827033647j:image

1日目、物販を買うために少し早めに出たがとても並びました。企画展に入るのに1時間くらい、物販に1時間半くらい?かかりました。

 

無事に欲しかった物すべて買えたのでよかったです

 

海外からもたくさんの人が来てて驚きました。

台湾の人が多かった気もします

 

f:id:jupiteru:20180827033724j:image

途中で友達と合流し色々回りました。

 

omoiさんのとこでCDを買いサインをもらったり、赤十字ブースで募金をしたり、クリアファイルを買ったりして企画展とても良かったです!

 

夜の公演とても良かったです!一部の曲がわからず、あと初参加なのでコールがわからず苦労しました!けどノリで乗り切りました!

 

 f:id:jupiteru:20180827033800j:image

 

2日目、だいたい3時くらいに出て、まず企画展に行きました!

この時、入場者特典のピンバッジ配布終了だったので悲しかった・・・

 

会場でオフィシャルCD買いたかったけどなかった……

 

じゃんけん大会に参加したり(何ももらえなかった)、写真を撮ったりして楽しかったです

 

2日目のライブは1人だったので色々心配だったけど楽しかったです!

 

セトリ予習してきたので曲もわかってとても楽しい2時間でした。

 

まだ幕張がああるので書きませんが、最後のMC、グリーンライツセレナーデ、アンコール前の曲、某有名曲、僕が初めてきいたボカロ曲が流れてまじ泣きしました。ほんまにやばいです。最高です

 

ペンライト2本目買ったけど後悔はしてない!

ペンラ 使えるライブ行くなら、絶対に2本あったほうがいい!

 

 

 

 

以下マジカルミライが面白い理由の考察

マジカルミライが楽しい理由

・自分が曲の一部になれる?

・自分以外の人と一緒に楽しめる

・自分の知ってる曲が目の前でミクさん、リンちゃんをはじめとする、ボーカロイド たちが目の前で歌ってくれる!コール(合いの手)ができる!

・曲の音圧がすごい

 

マジカルミライは一度でも参加するととてもハマると思います

 

今日の夜公演ミクさんが最後に目の前で「きっとまた大阪に帰ってくるからね!」みたいなことを言ってたから来年も大阪に来てくれると思う!

頼む来て!

こなくても幕張行く!