電子書籍の厳選無料作品が豊富!

はじめましてこんばんは hommado と申します。


じつは先週の授業でこんな問題を出されたんですがもしできたらとあるプログラムを教えてほしいのです。
問題は
「キーボードから何階調にするのかを読み込むことで、入力画像LAX.bmpを任意の階調数に変換する」という
プログラムです。
一応下に素体のプログラムをおいたんで、其のプログラムに何か付け足す感じでお願いします。「/*******↓基本的には、この範囲に画像処理プログラムを書く****/」から

「 /********↑**************************************************/」の中にプログラムを書くかんじなのでもし分かったら教えてください。お願いします。

あと何か他の所に付け足すようなところがあったら教えてください


ここから元のプログラム

// Bitmapファイルを読み込んで,
// 別のファイルに出力するだけのプログラムです

#include<stdio.h>

#define XSIZE 256 /* 画像の横サイズ*/
#define YSIZE 256 /* 画像の縦サイズ*/

void main(void)
{
int x,y;
char fni[40],fno[40]; /* 入力ファイルと出力ファイルの名前を格納するための配列*/
unsigned char head[1078],buf[YSIZE][XSIZE]; /* 入力ファイル(ビットマップファイル)のヘッダ情報と輝度値情報を格納するための配列*/
unsigned char in_image[YSIZE][XSIZE]; /* 入力画像の画素の輝度値を格納するための配列*/
unsigned char out_image[YSIZE][XSIZE]; /* 出力画像の画素の輝度値を格納するための配列*/

FILE *fp,*fp2; /* ファイルポインタ*/

printf("ファイル名を入れてください:");
scanf("%s",fni);

fp=fopen(fni,"rb"); /* 読み込み& バイナリモードでオープンする*/

/* 配列head にビットマップファイルのヘッダ情報が格納されます*/
fread(head,sizeof(unsigned char),1078,fp); /* unsigned char 型のデータ×個を配列head に読み込む*/

/* 配列buf にビットマップファイルの輝度値情報が格納されます*/
fread(buf,sizeof(unsigned char),XSIZE*YSIZE,fp);

for(y=0;y<YSIZE;y++){
for(x=0;x<XSIZE;x++){
in_image[y][x]=buf[y][x]; /* 画像の左下の画素が座標buf[0][0] です*/
}
}

printf("読み込み終了しました!\n");

printf("出力ファイル名を入れてください:");
scanf("%s",fno);


/*******↓基本的には、この範囲に画像処理プログラムを書く****/


      ここにプログラムを書いてください!
     (もしここ以外で、他の所で付け足すプログラムがあったら何行目に
      何を書くのかも教えてください)



/********↑**************************************************/

fp2=fopen(fno,"wb"); /* 書き込み& バイナリモードでオープンする*/

/* 配列head の内容を出力ファイルに書き込む*/
fwrite(head,sizeof(unsigned char),1078,fp2);

/* 配列out_image の内容を出力ファイルに書き込む*/
fwrite(out_image,sizeof(unsigned char),XSIZE*YSIZE,fp2);

fclose(fp); /* ファイルをクローズする*/
fclose(fp2); /* ファイルをクローズする*/

printf("作業完了!\n");

}

A 回答 (2件)

ステキなくらい丸投げって感じですねぇ……


入力されるビットマップ(LAX.bmp)のフォーマットも書かれていませんし。
8Bitカラーなのか、16(15)Bitカラーなのか、24bitカラーなのか……

>unsigned char head[1078],buf[YSIZE][XSIZE]; /* 入力ファイル(ビットマップファイル)のヘッダ情報と輝度値情報を格納するための配列*/

ということなので、おそらく8Bitカラー…なのでしょう。
1078なんていうマジックナンバーが唐突として出てくる辺りが、出題者に対してどうなのよ?
と突っ込みたいところですが。
# とりあえずsizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD) * 256)で1078になる…っぽい。

で……8Bitカラーということはカラーパレットがあるワケで、

>「キーボードから何階調にするのかを読み込むことで、入力画像LAX.bmpを任意の階調数に変換する」という

はカラーパレットを操作するコトで可能なんじゃないですかねぇ……
ヘッダを構造体ではなくunsigned char head[1078]で一纏めにして読み込んでいるので、カラーパレットいぢるのも手間と言えば手間ですが……。
カラーパレット内のRGB値から明度などを算出、モノクロ化(必要かは不明ですけど)して、階調数に変換…なんでしょう。
たぶん。
# 2階調に変換…だとモノクロビットマップ出力しろってことなんでしょうかねぇ……。
    • good
    • 0

ビットマップについての知識はありますか??



あるという前提で、以下のサイトを参考にして自分なりにアレンジしてみてください。

参考URL : http://www.ruche-home.net/program/bmp/bitfield
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!