• 締切済み

C言語でBMP(16bit)を扱う方法

組み込みソフトの作成を行なっており、液晶に画像を表示するソフトを 作りたいと思っております。 16bitのビットマップ画像をC言語のソースにするにはどうすればよいでしょうか? interface2011年5月号の付録(Renesas RX62N)を使用して、3.5インチQVGAのTFT液晶に 画像を表示したいと思っているのですが、自分で用意した16ビットのビットマップ画像を どうすればC言語ソースに落とせるのかがわかりません。 付録のサンプルプログラムでは、pct_data[]={65535,65535,・・・・}; と各ドットを16bitで表現した配列になっているのですが、ビットマップデータからこのような 配列の作成方法を教えて頂けると助かります。 よろしくお願いいたします。

みんなの回答

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.5

サンプルのソースはWebサイトで見てみましたが、ボードの仕様が分からないので、かなり一般的な概要レベルのアドバイスとなります。 手順としては、大雑把には以下の様になります。 1)BMPファイルのフォーマットを理解 2)ピクセルのデータを抜き出す 3)Cのソースファイルにデータを並べる 4)オリジナルの画像を作ってやってみる 1)については、BMPファイルの構造(Webで簡単に検索出来ます)を見ながら、試しにサンプルのmiss.bmpをダンプして(ダンプの方法もWebサイトで検索出来ます。Debugコマンドを使う方法や、フリーソフトなどでバイナリファイルがダンプ出来ます)、フォーマットと実際のヘッダー情報やピクセルデータの並びを理解します。 2)は、ピクセルデータ部分だけを抜き出してCのソースに使える形、即ちテキストのフォーマットにします。フリーのダンプソフトなどを使うと簡単にテキストに変換できます。 ただし、恐らくそのままは使えず、ビット長を変換しないとならないと思いますが、ボードのグラフィックの仕様書と、BMPファイルの各ピクセルのビット表現を比べて適切に変換します。Windows上で動作するCコンパイラなどがあれば、プログラムを作ってしまうのが楽だと思います。 3)出来上がったピクセルデータは、16ビット長の16進表現(例えば、BD 6A とか)になっていると思いますが、これを再度10進変換しなくても、&hを付けて、&hBD6Aと記述していけばよいです。 例えば、 unsigned short data[] = {48490,48490,48490,… だった部分は、 unsigned short data[] = {&hBD6A, &hBD6A, &hBD6A, … と書き換えていけばOKです。縦横のサイズは間違えない様に。 4)だいたい手順が理解出来たら、サンプルのBMPファイルと同じサイズのデータをペイントなどで作成し、上の手順でCのソースコードのデータにしていけば、オリジナルの”もぐらたたき”が出来上がります。 ビット長を変換するのがちょっとやっかいですが、ある程度C言語が使えて、Windowsのプログラムが作成できるCコンパイラがあれば、BMPファイルを読み込んで、そのボード用のグラフィックデータ(テキスト)に変換するプログラムなどを作ってしまう(さほど難しくはありません)のが良いと思います。もちろんプログラムを組まなくても、(16進が使える)電卓を叩いたり、エクセルなどでも出来なくはないですが、何枚もの画像を変換するとなるとちょっと手間です。 かなり大雑把な説明ですが、それぞれの方法(BMPのフォーマット、DUMPなど)はWebなどで検索しながら勉強していってみてください。 ご参考に。

全文を見る
すると、全ての回答が全文表示されます。
noname#208507
noname#208507
回答No.4

16bitのビットマップ画像とは,Windows bitmap形式ファイル(.bmp)のことでしょうか. NetPBM形式(ascii)という画像フォーマットが単に画素値をテキストファイルにダンプしたものなので,16bitのNetPBM形式画像に対応したソフトでbmpからフォーマット変換すれば配列化が簡単になると思います. たとえば ImageMagick ( http://www.imagemagick.org ) をインストールして,コマンドラインから  convert -depth 16 -compress none (入力ファイル名).bmp (出力ファイル名).ppm と打ち込めば,RGBの値がテキスト形式で保存されます.

参考URL:
http://netpbm.sourceforge.net/doc/ppm.html
全文を見る
すると、全ての回答が全文表示されます。
回答No.3

ビットマップのファイルのダンプリストを写す。

全文を見る
すると、全ての回答が全文表示されます。
  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.2

バイナリデータを文字列で記述するのは「HEXフォーマット」と言います。 バイナリーからHEX形式に変換するツールはここらから プログラムを組める人ならこういうツールは簡単に自作できますね。 http://www.vector.co.jp/vpack/filearea/win/util/bin/conv/ HEXフォーマットについてはこれを参考に http://www.pastelmagic.com/tips/hexform/hexform.html ヘッダやチェックサムの部分を除いて、 データの本体は2文字で1バイトの値(00~FF)を表しているので、 C言語のソースに流用するなら2~4文字ずつ取り出して、 (処理系によっては上位/下位バイトの入れ替えが必要になります) 頭に16進数の 0x を加えてカンマで区切れば使えますね。 手作業では大変ですからテキストエディタのマクロ機能などを使かうか、 いっその事専用のツールを自作するのも勉強になるでしょう。 (この目的に合うツールは分らなかったので)

全文を見る
すると、全ての回答が全文表示されます。
回答No.1
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 極座標変換

    C言語で画像を極座標変換するソースコードをおしえていただけないでしょうか。512*512 32bitグレースケール(float)画像です。C初心者なので難しくて困っています。よろしくおねがいいたします。

  • c言語を使いダイアログにbmpを表示したい 

    はじめまして、 私は、c言語は初心者なのでが、ダイアログボックスに、画像(bmp)が表示することができません。 ソースは、 hdc = BeginPaint(hDlg, &ps); //指定ウィンドウ内での描写準備 // ビットマップをファイルからロードする hBitmap = ::LoadBitmap( NULL, _T("test.bmp") ); // ウィンドウのデバイスコンテキストハンドルを取得する hDC = GetDC( hDlg ); // メモリデバイスコンテキストを作成する hCompatDC = CreateCompatibleDC( hDC ); // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); // ビットマップをウィンドウに転送する(表示する) if(hBitmap != NULL){ StretchBlt( hDC, 0, 0, 100, 100, hCompatDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SendDlgItemMessage( hDlg, IDC_STATIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。

  • C言語の課題丸投げ

    C言語の課題丸投げ 5×5の魔方陣を作成するという課題なのですが、手順があります。 (1)配列を用意する (2)配列を初期化(0クリア)する。 (3)配列添字にスタート位置をセットする。 (4)法則に従い、配列に魔方陣データをセットする (5)配列を画面に表示する  (二重ループ) 以上です。わかる方がいたらお手数ですが、ソースコードだけでいいので、教えてください。 お願いします。

  • C言語の基礎を

    プログラマになりたくて、調べたら、まずはC言語から始めた方がいいと書いてあったので、さっそく教材(これからはじめるC言語の本)を買って基礎を覚えました。とりあえず買った教材は配列で終わっていたので配列まで勉強しました。基礎を覚えたら何をやればいいのかさっぱりわからないんです。ネットでCで書かれたソースを見てみると、まったく見たことのない言葉があったりして、Cをマスターするにはそういった言葉が全部わからないといけませんよね。プログラマの人はCぐらいできないとダメですよね。 配列が終わった後、何を勉強すればいいのか教えてください。 回答お願いします。

  • C言語で長方形を作る

    C言語で長方形の絵を作るにはどうすればよいのでしょうか?forなどの制御構造は分かるのですが画像になるとさっぱりです。まず家のパソコンでやる場合、特別なソフトが必要ですか? C言語による画像作成についてのURLやサンプルプログラミングがあれば教えていただきたいです。

  • C言語 丸(●)の作り方 

    C言語で配列の中に●のデータを入れたいのですが ex) char BOX[6][6]={ {0,0,1,1,0,0}, {0,1,1,1,0,0}, {1,1,1,1,1,1}, {1,1,1,1,1,1}, {0,1,1,1,1,0}, {0,0,1,1,0,0}, } このように入れるためのプログラムが教えてほしいです

  • C言語をどうしたら?

    学校でC言語を習っています。 そして学校ではC言語を確かビュジアルネットというソフトにソースファイルなどを入れてプログラムを練習しているのですが、家でも練習したいのでどうしたらいいか教えてください。できましたらフリーソフトとその使い方を教えてくださるとうれしいです。 そして、いつかは他のパソコンでもそれが体験できるようにしたいので、その場合の方法も教えてください。

  • C言語について

    C言語を学習しています。 入門レベルの知識しか有りません。 <演習問題>  要素数nの配列v内のkeyと等しい全要素の添字を配列idxに格納する  関数search_idxを作成せよ。  返却するのはkeyと等しい要素の個数とする。   int search_idx(const int v[], int idx[], int key, int n); 例えば、vに受け取った配列の要素が{1,7,5,7,2,4,7}でkeyが7で     あれば、idxに{1,3,6}を格納した上で3を返却する。 というのが有るのですが、上手くプログラムが組めません。 ソースコードを伝授して頂けたら有難いです。

  • C言語でゲームを作りたいんですど・・・

    変数4つ、配列一つ 制御文はif文、switch文、繰り返し制御をそれぞれ1回以上使って、C言語のゲームを作りたいんですけど、まったくわかりません。 どんなソースを作ればいいでしょうか??

  • VBでC言語のポインタみたいな使い方?

    VBでC言語のポインタみたいに、一個の関数に配列のアドレスを渡して汎用的に使える方法は出来ますでしょうか? 宜しくお願いします。 PS:配列のデータは直線を描く為のデータです。