画像出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
桃李

画像出力について

#1

投稿記事 by 桃李 » 10年前

これで、加工した画像を8bitにして6枚出力したいのですが、真っ黒な画像しか出てきません。原因がわかる方教えてください。


void ReadImage(
char *InFile,
unsigned short *InImage,
int Xsize,
int Ysize)
{
int i,j,FileSize,S_Mark;
FILE *fp;
if((fp=fopen(InFile,"rb"))==NULL){
printf("could not open filename %s \n",InFile);
exit(0);}
fseek(fp,0,SEEK_END);
FileSize=ftell(fp);
fclose(fp);
S_Mark=FileSize-(Xsize*Ysize*sizeof(unsigned short));
if((fp=fopen(InFile,"rb"))==NULL){
printf("Could not open filename %s \n",InFile);
exit(0);}
fseek(fp,S_Mark,SEEK_SET);
fread(InImage,sizeof(unsigned short),Xsize*Ysize,fp);
fclose(fp);
}
//2バイト画像読み込み

void SwapByte(
unsigned short *InImage,
int Xsize,
int Ysize)
{
int i;
for(i=0;i<Xsize*Ysize;i++){
InImage=
((InImage>>8)&0x00ff)|((InImage<<8)&0xff00);
}
}
//スワップバイト

void WriteImage(
char *OutFile,
unsigned short *OutImage,
int Xsize,
int Ysize)
{
FILE *fp;

if((fp=fopen(OutFile,"wb"))==NULL){
printf("Could not open filename %s \n",OutFile);
exit(0);
}

fwrite(OutImage,sizeof(unsigned short),Xsize*Ysize,fp);

fclose(fp);
}//2byte画像書き出し

void Write8bitImage(
char *OutFile,
unsigned char *OutImage,
int Xsize,
int Ysize)
{
FILE *fp;

if((fp=fopen(OutFile,"wb"))==NULL){
printf("Could not open filename %s \n",OutFile);
exit(0);
}
fwrite(OutImage,sizeof(unsigned char),Xsize*Ysize,fp);

fclose(fp);
}
//8bit画像書き出し

int main(int argc, char *argv[])
{
unsigned short *InImage,*OutImage;
unsigned char *Out8bitImage;
char filename[100];
char InFile[100],OutFile[100];
int i,j,x,y,Xsize,Ysize,sp,p,q,r,a,b,c,d,A,B,bit;

FILE *fp;

if (argc != 6){
printf("1)ファイル名\n");
printf("2)入力画像名\n");
printf("3)出力画像名\n");
printf("4)Xsize\n");
printf("5)Ysize\n");
printf("6)スワップバイトの Yes:1 No:2\n");
exit(0);
}
strcpy(InFile, argv[1]);
strcpy(OutFile, argv[2]);
Xsize=atoi(argv[3]);
Ysize=atoi(argv[4]);
sp=atoi(argv[5]);

bit=8;

InImage = new unsigned short[Xsize*Ysize];
OutImage = new unsigned short[Xsize*Ysize];
Out8bitImage = new unsigned char[Xsize*Ysize];
//動的容量確保

for(i=0;i<Xsize*Ysize;i++) InImage=0;
for(i=0;i<Xsize*Ysize;i++) OutImage=0;
for(i=0;i<Xsize*Ysize;i++) Out8bitImage=0;
//初期化


ReadImage(InFile,InImage,Xsize,Ysize);
//2バイト画像読み込み

if(sp==1){
SwapByte(InImage,Xsize,Ysize);
}
//スワップバイト


for(p=0;p<6;p++){
switch(p+1)
{
case 1:
a=1, b=0, c=1, d=0, A=Xsize, B=1;
break;
case 2:
a=-1, b=Ysize-1, c=-1, d=Xsize-1, A=Xsize, B=1;
break;
case 3:
a=-1, b=Ysize-1, c=1, d=0, A=1, B=Ysize;
break;
case 4:
a=1, b=0, c=-1, d=Xsize-1, A=1, B=Ysize;
break;
case 5:
a=-1, b=Ysize-1, c=1, d=0, A=Xsize, B=1;
break;
case 6:
a=1, b=0, c=-1, d=Xsize-1, A=Xsize, B=1;
break;
}
//回転


for(y=0;y<Ysize;y++){
for(x=0;x<Xsize;x++){
OutImage[(a*y+b)*A+(c*x+d)*B]=InImage[y*Xsize+x];

}
}
//6枚画像を作る

if(bit>8){
for(i=0;i<Xsize*Ysize;i++)
Out8bitImage=(unsigned char)(OutImage>>(bit-8));
}
//シフトビット


sprintf(filename,"Out8bitImage%d",p+1);
Write8bitImage(filename,Out8bitImage,Xsize,Ysize);

}
delete[] InImage;
delete[] OutImage;
delete[] Out8bitImage;
//メモリ領域解放


}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 画像出力について

#2

投稿記事 by みけCAT » 10年前

ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
桃李 さんが書きました:これで、加工した画像を8bitにして6枚出力したいのですが、真っ黒な画像しか出てきません。原因がわかる方教えてください。
詳しくチェックしてはいませんが、bit=8になっているので

コード:

	if(bit>8){
   		for(i=0;i<Xsize*Ysize;i++)
   		Out8bitImage[i]=(unsigned char)(OutImage[i]>>(bit-8));
   	}
という部分でOut8bitImageの各要素に値を設定する処理が行われず、これと初期化以外にOut8bitImageの要素の値を設定する処理は無いため、
初期化で代入された0がそのまま書き出され、それがビューアに黒と解釈されたのが原因の一つ(他にあるかは不明)だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る