質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3942閲覧

C言語における画像処理について

KSehino

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/07/07 13:41

プログラミング初心者です
今、学校でC言語を習っている途中の初心者です。今回、C言語における画像処理の基礎的なことを学んだのですが、その後自分で試してみようとしたらうまくいきません。
できない内容
学校では右下の1ビットを塗りつぶすということをしたので、ではほかのところも多く塗れないのかと疑問に思い、試してみたのですが、うまくいきません。周りを囲んでみたいと思ってプログラムを書いたのですが、全然うまくいきません。
該当のソースコード

int main(void) { char name[100]; unsigned char header[54]; unsigned char screen[480][640][3]; FILE *fp; printf("読み込むビットマップファイルは?>>"); scanf("%s", name); fp = fopen(name, "rb"); fread(header, 1, 54, fp); fread(screen, 1, 480 * 640 * 3, fp); fclose(fp); screen[479][639][2] = 255; screen[0][0][0] = 0; screen[0][0][1] = 0; fp = fopen("j116135.bmp", "wb"); fwrite(header, 1, 54, fp); fwrite(screen, 1, 480 * 640 * 3, fp); fclose(fp); return 0; }``` **試したこと** 上記のコード下から6~8行目を変更すれば出来ると思い、いろいろ試してみたのですが、結局1ビットしかぬれませんでした。 また、freadやfwriteをいじってみたのですが、エラーが起こってしまいました。 **その他** 最終的に周りを青で3ビットずつ囲いと思っています。 どこをどのようにすれば複数を塗りつぶせるか、また、単色で囲うことができるのか返答のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

上辺3ピクセルなら screen[0〜2][0〜639][0〜2] に値をセットすればいいわけですよね。
各ピクセルの3バイトはR,G,Bの順でいいんでしたっけ。

for (int y=0; y<3; ++y) { for (int x=0; x<640; ++x) { screen[y][x][0] = 0; screen[y][x][1] = 0; screen[y][x][2] = 255; } }

これで上辺3ピクセルが青く塗りつぶせました。右辺左辺下辺も同じように書いてみてください。

投稿2016/07/07 14:34

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSehino

2016/07/10 08:04

複数のピクセルを塗るのはそのようにするのですね! ありがとうございます!
guest

0

ベストアンサー

こんにちは。

コピペ・ミスがあるようですが、基本的にはできてますよ。
後、インデント等があまりに酷いので修正しました。

C

1#include<stdio.h> 2 3int main(void) 4{ 5 char name[100]; 6 7 unsigned char header[54]; 8 unsigned char screen[480][640][3]; 9 10 FILE *fp; 11 printf("読み込むビットマップファイルは?>>"); 12 scanf("%s", name); 13 14 fp = fopen(name, "rb"); 15 16 fread(header, 1, 54, fp); 17 fread(screen, 1, 480 * 640 * 3, fp); 18 fclose(fp); 19 20 screen[0][0][0] = 255;// 青 21 screen[0][0][1] = 0; 22 screen[0][0][2] = 0; 23 24 screen[0][1][0] = 0; 25 screen[0][1][1] = 255;// 緑 26 screen[0][1][2] = 0; 27 28 screen[0][2][0] = 0; 29 screen[0][2][1] = 0; 30 screen[0][2][2] = 255;// 赤 31 32 fp = fopen("j116135.bmp", "wb"); 33 fwrite(header, 1, 54, fp); 34 fwrite(screen, 1, 480 * 640 * 3, fp); 35 fclose(fp); 36 37 return 0; 38}

screen[0][0][*]は右下ではなくて、左下ですね。
bmpファイルは、上下は逆さまですが左右はそのままですので。

後、Windows 10のPaintはドラッグ・ドロップしても更新されたjpgファイルを表示しないようです。
一度Paintを閉じて、再度表示させると更新されます。

投稿2016/07/07 14:27

編集2016/07/07 14:30
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSehino

2016/07/10 08:05

詳しい回答ありがとうございます! 少しは理解できるようになりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問