ページ 11

白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月25日(月) 16:44
by saki
白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?
(visual stdio 2005のC++でやっています。)
プログラムを書いていただけたら嬉しいです。
星の画像を使っています。幅256ピクセル、高さ256ピクセルです。
星の画像の二次元配列がどのようなプログラムで表示できるのかも分かりません。
よろしくお願いします。

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月25日(月) 17:34
by usao
何かの課題でしょうか?
あと,もうちょっと以下のような詳細がわかると良いと思います.

・BMP : どこに存在するのか.ファイルから読み込む?
      読み込むのだとしたらどういった手段で?
・白黒化 : 既に白黒化されたBMPがあるのか,この処理もプログラムで行う必要があるのか
・txt保存 : 具体的な保存フォーマットは? (要素間の区切りとか)
・二次元配列 : これは具体的に何のために必要?
・表示 : txtに保存することの他に,表示を行う必要があるということでしょうか.
      また,表示対象は何? 白黒化する前の絵? それとも,した後の絵?

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月25日(月) 22:54
by みけCAT
対象のBMPのフォーマットも教えてください。
2色?16色?256色?16ビット?24ビット?32ビット?全部?

※もちろん白黒の画像を24ビットで保存することも考えられますね。

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 17:41
by saki
usao さんが書きました:何かの課題でしょうか? はい。
あと,もうちょっと以下のような詳細がわかると良いと思います.

・BMP : どこに存在するのか.ファイルから読み込む?
      ・ペイントで作成したものを、ファイルから読み込みたいです。
      読み込むのだとしたらどういった手段で?
      ・プログラムで読み込みたいです。
・白黒化 : 既に白黒化されたBMPがあるのか,この処理もプログラムで行う必要があるのか
        ・題名の書き方がおかしかったです。すいません。 もともと白黒のBMPを使っています。
・txt保存 : 具体的な保存フォーマットは? (要素間の区切りとか)
       ・すいません。これはあまりわかりません。
・二次元配列 : これは具体的に何のために必要?
          この配列を使って、画像を表示するためだと思います。
・表示 : txtに保存することの他に,表示を行う必要があるということでしょうか.
      また,表示対象は何? 白黒化する前の絵? それとも,した後の絵?
      ・txtに保存してエクセルにその画像表示しろと言われています。
       

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 17:44
by saki
たぶん24bitだと思います。

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 18:40
by usao
整理すると, これは課題であって,

既に内容が白黒になっている24bitBMPを読込んで…
(A)何らかのフォーマットでテキストファイルに保存する.
(B)画像をエクセルに表示する.

という2つの事柄を行うプログラムをC++で作る という内容でしょうか.
((A)だけでなく(B)までをC++側でやる?)


現時点ではどこまでできていて,どのあたりが問題となっているのか について
示されるとよいと思います.
オフトピック
(B)の内容は私では力不足で無理なので,他の回答者様に期待…

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 20:07
by saki
整理するとそういうことになります。

今のところはあってるかどうかわからないんですが、このようなプログラムでしているのですが、エラーがでます。

#include<stdio.h>
#include<stdlib.h>

image_read(image,xsize,ysize,star)
unsigned char *image
int xsize;
int ysize;
char *star;
{
FILE*fp;

if((fp=fopen(star,"rb"))==NULL){
printf("ファイル・オープン・エラー\n");
exit(-1);
}
fread(image,xsize,ysize,fp);
fclose(fp);
}

image_write(image,xsize,ysize,star)
unsigned char *image
int xsize;
int ysize;
char *filename;
{
FILE*fp;

if((fp=fopen(star,"wb"))==NULL){
printf("ファイル・オープン・エラー\n");
exit(-1);
}
fread(image,xsize,ysize,fp);
fclose(fp);
}

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 22:13
by みけCAT
コードを提示するときは、BBcodeを有効にした状態でcodeタグで囲み、
かつきちんとインデントをしていただけると、見やすくて助かります。

まず、fopenでwbモードで開いているのに、そのファイルポインタでfreadをしているのはおかしいと思います。
変数imageの宣言でセミコロンが抜けています。
image_write関数の宣言で、第4引数の名前が矛盾しています。(そもそもなぜ古い書き方を使用しているのか?)

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 22:18
by みけCAT
saki さんが書きました:・txtに保存してエクセルにその画像表示しろと言われています。
「エクセルにその画像表示」とは、具体的にどのような処理ですか?
考えられる例
・プログラムでxlsxファイルを作成し、エクセルを起動してそれを読み込ませる
 ・セルを画像から読み込んだ白or黒で塗る
 ・画像を直接貼る
・プログラムでxlsファイルを作成し、エクセルを起動してそれを読み込ませる
 ・セルを画像から読み込んだ白or黒で塗る
 ・画像を直接貼る
・プログラムでエクセルを操作し、セルを画像から読み込んだ白or黒で塗っていく
・Microsoft Excelとは関係なく、プログラムがデータを保存したあと「エクセルにその画像」と表示する
・エクセル(問題集の書籍)に読み込んだ画像をプロジェクションマッピングする

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月26日(火) 22:38
by みけCAT
とりあえずBMPのファイルフォーマットを解説しているサイトを貼っておきます。
プログラミング/BMPファイル仕様/バイナリ構造 - ルーチェ's Homepage

また、実際にBMPファイルをペイントなどで作成し、バイナリエディタで中身を見てみるのも勉強になります。
TSXBINというソフトを使えば、BMPファイルなどの構造をわかりやすく表示してくれます。

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年11月27日(水) 15:33
by saki
確かにfreadはおかしいと思いました。
この場合どのようなプログラムにすればいいですか?


おそらくプログラムでxlsファイルを作成し、エクセルを起動してそれを読み込ませて画像を直接貼るだと思います。

Re: 白黒化したBMPを二次元配列にして、.txtで保存したいのですがどうすればいいですか?

Posted: 2013年12月01日(日) 16:01
by みけCAT
●BMPを読み込むプログラム
BMPファイルをfopenでバイナリモードで開く
→ヘッダ部分を読み込む
→形式チェック(対応している形式か、どんなフォーマットか)
→画像データを読み込む
→2値化
→後のプログラムで扱いやすい形式に格納(hoge[width*y+x]形式の配列など)
→fclose

●2値化したデータを.txtで書き出すプログラム
書き込むtxtファイルをfopenでテキストモードで開く
→fprintfなどで2値化したデータをファイルに書き出す
→fclose

●2値化したデータをxlsファイルに埋め込んだ後、エクセルを起動してそれを読み込ませるプログラム
書き込むxlsファイルをfopenでバイナリモードで開く
→xls形式のデータを作成してfwriteなどでファイルに書き出す
→fclose
→system関数でエクセルを起動する

このような流れだと思います。
xlsファイルの作り方は難しそうなので、頑張って調べてください。
xmlファイルや画像ファイルをzipでまとめた形式であるxlsx形式の方が簡単そうだと思いますが、こちらではダメですか?