ページ 11

C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:12
by yutaka
C言語でbitmapファイルを作成して、色をつけて輝度を変えたいと考えてますが

まず、下記のようにファイルをopenして書きこもうと思って適当ですが書いたのですが
ビルドも通りません。

質問なのですが、bitmapを作成して色をつけて輝度を変えることはできるのでしょうか。
ご意見よろしくお願いします。

#include <io.h>
#include <sys\stat.h>

#include <stdio.h>

int main()
{
int fd;
char filename = "test.bmp";
int array[262144];
int kido;

for(int y=0;y<512;y++){
kido=65535;
for(int x=0;x<512;x++){
array[x]=kido;
kido = kido - 128;
}
}
fd = open(filename,O_RDWR,O_BINARY);
write(fd,array,xxx);
close(fd);

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:20
by みけCAT
main関数のカッコの対応が一致していません。
また、識別子xxxが宣言されていないようです。
これがソースコード全体でないならば、ソースコード全体を貼っていただけますか?
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:21
by みけCAT
yutaka さんが書きました:質問なのですが、bitmapを作成して色をつけて輝度を変えることはできるのでしょうか。
はい。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:23
by 初級者
bmpファイルには、あらかじめ定まっている
ファイルフォーマットがあります。
当然ご存じですよね?

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:24
by みけCAT
提示されたソースコードっぽい文字列は、変数filenameの型も不適切なようですね。

「一般的な」(標準ライブラリ関数であり、入門サイト/本でより早い段階で解説されている気がする)
fopen、fwrite、fcloseではなく、open、write、close関数を採用した理由はありますか?

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:27
by みけCAT
初級者 さんが書きました:bmpファイルには、あらかじめ定まっている
ファイルフォーマットがあります。
当然ご存じですよね?
ビットマップデータの形式は、bmpファイルだけではありません。
他の例:PNM (画像フォーマット) - Wikipedia
このフォーマットにも決められた形式はありますが、
質問者独自のフォーマットでbitmapデータが格納されたファイルを作りたい可能性もまだ否定できません。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:43
by 初級者
なんだか深読みしすぎっぽい感じが
します。

まあ、それはさておき、
あのコードを読む限り、
(広く知られている)
bmpファイルの形式を
理解しているとは、
とても思えませんでした。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:54
by みけCAT
初級者 さんが書きました:なんだか深読みしすぎっぽい感じが
します。
ごめんなさい。
ソースコード(仮)中に"test.bmp"とあるので、BMPファイルを作りたいと予想できますね。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:55
by yutaka
初級者 さんが書きました:なんだか深読みしすぎっぽい感じが
します。

まあ、それはさておき、
あのコードを読む限り、
(広く知られている)
bmpファイルの形式を
理解しているとは、
とても思えませんでした。
確かにそのとおりです。とりあえず書いちゃいました。
参考になるようなものがありましたらご意見おねがいします。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 22:56
by みけCAT
yutaka さんが書きました:参考になるようなものがありましたらご意見おねがいします。
とりあえず、このあたりでしょうか。
画像処理におけるアルゴリズム
BMPファイルのフォーマット

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 23:02
by みけCAT
とりあえず、提示されたソースコードをC99としてコンパイル可能な状態にしました。

コード:

#include <unistd.h>
#include <fcntl.h>

int main(void)
{
	int fd;
	const char* filename = "test.bmp";
	int array[262144];
	int kido;
	size_t xxx = 0;

	for(int y=0;y<512;y++){
		kido=65535;
		for(int x=0;x<512;x++){
			array[x]=kido;
			kido = kido - 128;
		}
	}
	fd = open(filename,O_RDWR,O_BINARY);
	write(fd,array,xxx);
	close(fd);
	return 0;
}

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 23:18
by yutaka
みけCAT さんが書きました:提示されたソースコードっぽい文字列は、変数filenameの型も不適切なようですね。

「一般的な」(標準ライブラリ関数であり、入門サイト/本でより早い段階で解説されている気がする)
fopen、fwrite、fcloseではなく、open、write、close関数を採用した理由はありますか?
fwriteを使うとfprintfを使わなくてはいけないかと思ってwriteを使いました。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 23:23
by yutaka
みけCAT さんが書きました:main関数のカッコの対応が一致していません。
また、識別子xxxが宣言されていないようです。
これがソースコード全体でないならば、ソースコード全体を貼っていただけますか?
コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。
write関数ないのxxxですが、引数わからなくxxxと記述してしまいました。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 23:29
by 初級者
yutaka さんが書きました: 確かにそのとおりです。とりあえず書いちゃいました。
ということは、Cのコードを書く前に、
他にすべきことがある、ということに
なりますね。
そちらを先に片づけましょう。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 23:30
by softya(ソフト屋)
よく分からず書かれているらしいと言うことは理解出来ましたので、次のような段階を踏むべきかと思います。
1.fprintfで書きだすテキストファイルとfwriteで書きだすバイナリファイルの違いを勉強する。バイナリエディタの使い方も理解する。
※ 今回open、write、close関数を使う必要はないです。
2.intやshortを含む構造体など自在にバイナリファイルとして書き出し読み込みが出来るプログラムを書けるように成る。 【修正】
3.bmpファイルのバイナリフォーマットを理解する。他のツールで作ったbmpのダンプツールなどを作ってみる。
4.思い通りのbmpファイルの出力プログラムを作成する。

Re: C言語でbitmapを作成

Posted: 2014年3月10日(月) 23:42
by みけCAT
TSXBINの詳細情報 : Vector ソフトを探す!
このソフトを利用すると、(よく利用されると思われる)BMPファイルの構造をわかりやすく表示してくれるので、
BMPファイルの構造を理解しやすくなります。
また、この時、RGB(82,71,66)という色を用いると、各色を0x00~0xFFの整数で表す時
(これはほとんどのBMPファイルの形式で利用される表し方です)、
赤がR、緑がG、青がBを表すASCIIコードのデータになるので、データと色の関係がわかりやすくなります。

Re: C言語でbitmapを作成

Posted: 2014年3月12日(水) 22:28
by yutaka
softya(ソフト屋) さんが書きました:よく分からず書かれているらしいと言うことは理解出来ましたので、次のような段階を踏むべきかと思います。
1.fprintfで書きだすテキストファイルとfwriteで書きだすバイナリファイルの違いを勉強する。バイナリエディタの使い方も理解する。
※ 今回open、write、close関数を使う必要はないです。
2.intやshortを含む構造体など自在にバイナリファイルとして書き出し読み込みが出来るプログラムを書けるように成る。 【修正】
3.bmpファイルのバイナリフォーマットを理解する。他のツールで作ったbmpのダンプツールなどを作ってみる。
4.思い通りのbmpファイルの出力プログラムを作成する。
回答ありがとうございます。
1~4.自分なりに調べてこちらで勉強した結果報告しますので確認していただけますか。

よろしくお願いします。

Re: C言語でbitmapを作成

Posted: 2014年3月12日(水) 23:15
by softya(ソフト屋)
> 1~4.自分なりに調べてこちらで勉強した結果報告しますので確認していただけますか。

いつでもOKです。
ソースコードやら、理解できたこと、実行結果(16進数ダンプ)などなどを添えられたほうが良いと思います。
1~4.バラバラで構いません。