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に上げていますのでそちらを参考にしてもらえると助かります そのうち書くので・・・
c,c++のコメントメモ(doxygenを使用)
この記事ははてなをメインにQrunch(閉鎖済み)、Crieitにクロス投稿しています
環境
VisualStudio2017
VisualStudio2019
Doxygenで生成したドキュメントのどこで表示されるかわからない
変数等の@briefは詳解の前の簡単な説明と詳解の後のところに表示。
@detailsは詳解のところに表示される。
コメントの書く場所をどうすべきか
VisualStudioではcppに書いたときInteliSenseが機能しなかったので
ヘッダーに書くのが良さそうです。
ただテンプレート関数をクラス内で多用するとコメントと合わせかなり行数が増えるので注意が必要です。
どうにかしたい・・・
前置簡易コメント
/// コメント /// @detailsと同じ扱いに int i; /// コメント
このコメントはvisualstudioで使うとxmlコメントの書き方に被るみたいで
InteliSense(変数や関数を選んだときに表示されるやつ)に表示されません。
なので以下を使用しました。
//! コメント //!@brief 説明
後置コメント
int a;///<コメント
これもvisualstudioでは「XMLコメントに無効なXMLが含まれます」と表示されるので
int a//!<コメント
を使用しました。
あと、Visual studioのc++用の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年ぶりに関西で開催されるマジカルミライに参加して来ました!
マジカルミライは今回が初参加でした!
※以下ネタバレ含むかもです
1日目、物販を買うために少し早めに出たがとても並びました。企画展に入るのに1時間くらい、物販に1時間半くらい?かかりました。
無事に欲しかった物すべて買えたのでよかったです
海外からもたくさんの人が来てて驚きました。
台湾の人が多かった気もします
途中で友達と合流し色々回りました。
omoiさんのとこでCDを買いサインをもらったり、赤十字ブースで募金をしたり、クリアファイルを買ったりして企画展とても良かったです!
夜の公演とても良かったです!一部の曲がわからず、あと初参加なのでコールがわからず苦労しました!けどノリで乗り切りました!
2日目、だいたい3時くらいに出て、まず企画展に行きました!
この時、入場者特典のピンバッジ配布終了だったので悲しかった・・・
会場でオフィシャルCD買いたかったけどなかった……
じゃんけん大会に参加したり(何ももらえなかった)、写真を撮ったりして楽しかったです
2日目のライブは1人だったので色々心配だったけど楽しかったです!
セトリ予習してきたので曲もわかってとても楽しい2時間でした。
まだ幕張がああるので書きませんが、最後のMC、グリーンライツセレナーデ、アンコール前の曲、某有名曲、僕が初めてきいたボカロ曲が流れてまじ泣きしました。ほんまにやばいです。最高です
ペンライト2本目買ったけど後悔はしてない!
ペンラ 使えるライブ行くなら、絶対に2本あったほうがいい!
以下マジカルミライが面白い理由の考察
マジカルミライが楽しい理由
・自分が曲の一部になれる?
・自分以外の人と一緒に楽しめる
・自分の知ってる曲が目の前でミクさん、リンちゃんをはじめとする、ボーカロイド たちが目の前で歌ってくれる!コール(合いの手)ができる!
・曲の音圧がすごい
マジカルミライは一度でも参加するととてもハマると思います
今日の夜公演ミクさんが最後に目の前で「きっとまた大阪に帰ってくるからね!」みたいなことを言ってたから来年も大阪に来てくれると思う!
頼む来て!
こなくても幕張行く!