• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語による画像処理で出力時に文字化け)

C言語による画像処理で出力時に文字化け

このQ&Aのポイント
  • C言語による画像処理で出力時に文字化けが発生しています。fxとfyの数値を修正しても問題が解決しません。
  • 画像の読み込み、Sobelオペレータによるエッジ検出、画像の書き込みまでの処理に問題はありません。
  • 文字化けの原因を特定するために、画像データの形式やファイルの読み書き処理を確認してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

>平滑化してからsobelフィルタをかけたものも作ったのですが、 >平滑化だけのものと、その後にsobelフィルタをかけたもので、 >差がありませんでしたなぜなのでしょうか・・・ 今度まともにソースすら見ていません ブログラムを2つに分けてみてください 平滑化のみを行った画像 平滑化を行った画像を使ってそーべる処理を行った結果 これを比較してください 多分動いてるんじゃないですか? 両方まとめて処理した時に動いていないのは 動いていないのではなくて両方の処理したデータだけを 連続的に同じファイルに書いているからです

pgmbgn
質問者

お礼

解決しました。元々違和感はあったのですが、*rに、フィルタリングした数値を一々入れていたのが原因でした。これではエッジ検出できないわけです。tmpに直接代入したらいけました。 前回同様デバッグが苦手です・・・隅から隅まで見たらどうでもいいところばかり試行錯誤し、焦点を絞ったら初歩的ミスや盲点を見逃す・・・ ご回答ありがとうございました。

pgmbgn
質問者

補足

それは既にしてみたのですが、あなたがそう仰るなら、たぶんそこに原因はなく、フィルタ自体に原因があるとみて、焦点を絞って調べようと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

No2 の補足に関して  (質問文と合わせて全文ちゃんと見てません) if(fprintf(fp,"%d\n",tmp) < 0) tmpに値を代入してる部分がどこにもないようですが・・・・ デバックモードなどでたまたま0になってるってだけの話ではないですか?

pgmbgn
質問者

補足

うっかりしていました。 tmpもいれ、sobelフィルタを3×3にして作りました。 するとQRコードみたいな画像が出力されました・・・。 また、平滑化してからsobelフィルタをかけたものも作ったのですが、平滑化だけのものと、その後にsobelフィルタをかけたもので、差がありませんでした。 なぜなのでしょうか・・・ 以下、平滑化→sobelフィルタをかけるプログラムです。 /*平滑化ここから*/~/*平滑化ここまで*/を取り除いたプログラムが、sobelフィルタだけのプログラム(QRコードが出力)です。 Picture* edge(FILE* fp,Picture* pPic,int type){ int i,j,k; /* ループ用変数 */ unsigned char tmp; /* 作業用変数 */ unsigned char *r,*g,*b; /* 作業に使用するポインタ */ if(fp == NULL || pPic == NULL || (type < 1 || type >6)) /* 引数が異常 */ return NULL; r = pPic->r; g = pPic->g; b = pPic->b; /* ファイルヘッダの出力 */ if(fprintf(fp,"P%d\n%d %d\n",type,pPic->x,pPic->y) < 0) return NULL; if(type == 2 || type == 3 || type == 5 || type == 6){ if(fprintf(fp,"255\n") < 0) return NULL; } /* 画像データの出力 */ /* 2値ascii形式 */ /*平滑化ここから*/ for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ *r =(*(r-1)+*r+*(r+1))/3; //平滑化 tmp=*r; r++; if(fprintf(fp,"%d\n",tmp) < 0) return NULL; } } r=r-(pPic->x*pPic->y); /*平滑化ここまで*/ for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ *r=*(r-1-(pPic->x))*(-1)+*(r+1-(pPic->x))+*(r-1)*(-2)+*(r+1)*2+*(r-1+(pPic->x))*(-1)+*(r+1+(pPic->x)); tmp = (int)sqrt(*r**r); r++; //printf("%d\n",tmp); if(fprintf(fp,"%d\n",tmp) < 0) return NULL; } } return pPic; } int main(void) { FILE *fpi,*fpo; char *fnamei = "input.pgm"; char *fnameo = "output.pgm"; fpi = fopen( fnamei, "r" ); if( fpi == NULL ){ printf( "%s error", fnamei ); return -1; } fpo=fopen(fnameo,"w"); edge(fpo,getPpm(fpi),2); fclose; return 0; }

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

そのpgmファイルをcatしたのですか? このコードから察するに、pgmファイルは端末に出力して読める形式ではなく、ビットマップ画像を表示できる類の専用のソフトを用いなければならないバイナリファイルになっているはずです。 端末に出力してその結果になった場合、恐らく^@は0x00を、\377は0xffを指します。動作は正常です。 不安であればbviやhexdump等のバイナリビュワーを用いて見てみましょう。 あるいは、専用の画像ビュワーを用いてpgmファイルを開いてみてはどうでしょう?

pgmbgn
質問者

補足

バイナリ形式なのが問題だったのですね。みなさんご回答ありがとうございます。 今度は http://www.mm2d.net/c/c-08.shtml を参考に、アスキー形式で作りました。 しかし出力が全部0になってしまい、画像は真っ黒です。 なにが原因なのか教えていただけないでしょうか。 sobelオペレータをかけた関数部とmain関数だけ抜粋しました(字数上) getPpmとputPpmは、入力関数と出力関数です。 *gとか*bとかtypeとかはいらないですが気にしないでください・・・ Picture* edge(FILE* fp,Picture* pPic,int type){ int i,j,k; /* ループ用変数 */ unsigned char tmp; /* 作業用変数 */ unsigned char *r,*g,*b; /* 作業に使用するポインタ */ if(fp == NULL || pPic == NULL || (type < 1 || type >6)) /* 引数が異常 */ return NULL; r = pPic->r; g = pPic->g; b = pPic->b; /* ファイルヘッダの出力 */ if(fprintf(fp,"P%d\n%d %d\n",type,pPic->x,pPic->y) < 0) return NULL; if(type == 2 || type == 3 || type == 5 || type == 6){ if(fprintf(fp,"255\n") < 0) return NULL; } /*処理*/ for(i=0 ; i<pPic->y ; i++){ for(j=0 ; j<pPic->x ; j++){ *(r++) =*(r-1)*(-1)+*(r+1); //-1 0 1のsobelフィルタにかけたつもり… if(fprintf(fp,"%d\n",tmp) < 0) return NULL; } } return pPic; } int main(void) { FILE *fpi,*fpo; char *fnamei = "input.pgm"; char *fnameo = "output.pgm"; fpi = fopen( fnamei, "r" ); if( fpi == NULL ){ printf( "%s error", fnamei ); return -1; } fpo=fopen(fnameo,"w"); edge(fpo,getPpm(fpi),2); fclose; return 0; }

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

>http://image.onishi-lab.jp/002.html#1 参考にされているurlに書かれているプログラムはP5やP6のバイナリファーマット用なのに、それをほぼそのままASCII形式のP2で使用してるからです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語で.pgmの画像を作り、見る

    Windows10のコマンドプロンプト上でC言語を使って.pgmの画像を作り、見ることができないので質問します。 以下のソースコードを実行してつくった。out.pgmファイルをGIMPとirfanviewというソフトを使ってみようとしましたが、GIMPはPNM 画像 エラーメッセージ 不正なファイルですと返し、irfanviewは invalid or unsupported PNMファイルと返し、何も表示されませんでした。 #include<stdio.h> int main(void){ FILE *fp; fp=fopen("out.pgm","wb"); fprintf(fp,"P5\n"); fprintf(fp,"#Image\n"); fprintf(fp,"256 256\n"); fprintf(fp,"255\n"); for(int i=0;i<256;i++){ for(int j=0;j<256;j++){ fwrite(&j,sizeof(unsigned char),1,fp); } } fclose(fp); return(0); } どなたかC言語で.pgmの画像を作り、見る方法を教えてくださいお願いします。

  • 行毎の黒のドット(ピクセル)数を教えていただけませんか?

    開発環境Microsoft Visual Studio .NET 2003 2値画像を読み込んだ時、各行毎の黒のピクセル(ドット)数を表示する プログラムを組もうとしているのですがわかりません。 画像読み込みまではできたのですがその後のプログラムがわかりません 誰か組んでいただけないでしょうか? #include <stdio.h> #include <process.h> #define Y_SIZE 3648 // 処理できる最大画像 #define X_SIZE 3648 #define HIGH 255 // 画像の最大強度値 #define LOW 0 // 画像の最小強度値 #define LEVEL 256 // 画像の強度レベル値 // BMPファイルのフォーマットに従って用意した変数 typedef unsigned short WORD; typedef unsigned long DWORD; WORD bfType; DWORD bfSize; WORD bfReserved1, bfReserved2; DWORD bfOffBits; DWORD biSize, biWidth, biHeight; WORD biPlanes, biBitCount; DWORD biCompression, biSizeImage, biXPelsPerMeter, biYPelsPerMeter, biClrUsed, biClrImportant; unsigned char image_in[Y_SIZE][X_SIZE][3]; // 入力カラー画像配列 unsigned char image_out[Y_SIZE][X_SIZE][3]; //出力カラー画像配列 unsigned char image_bw[Y_SIZE][X_SIZE]; //濃淡画像配列 unsigned char data_rgb[Y_SIZE][X_SIZE][3]; // RGB画像配列 //******************************************** // 24Bitビットマップファイル読み込み * //******************************************** void readBMP( char *filename, // BMPファイル名 unsigned char image[Y_SIZE][X_SIZE][3] // 24ビットRGB画像配列 ) { FILE *fp; int i, j, k; // ファイルオープン if ((fp = fopen(filename, "rb"))==NULL) { printf("readBmp: Open error!\n"); exit(1); } printf("input file : %s\n", filename); // ヘッダー情報読み込む fread(&bfType, sizeof(bfType), 1, fp); fread(&bfSize, sizeof(bfSize), 1, fp); fread(&bfReserved1, sizeof(bfReserved1), 1, fp); fread(&bfReserved2, sizeof(bfReserved2), 1, fp); fread(&bfOffBits, sizeof(bfOffBits), 1, fp); fread(&biSize, sizeof(biSize), 1, fp); fread(&biWidth, sizeof(biWidth), 1, fp); fread(&biHeight, sizeof(biHeight), 1, fp); fread(&biPlanes, sizeof(biPlanes), 1, fp); fread(&biBitCount, sizeof(biBitCount), 1, fp); fread(&biCompression, sizeof(biCompression), 1, fp); fread(&biSizeImage, sizeof(biSizeImage), 1, fp); fread(&biXPelsPerMeter, sizeof(biXPelsPerMeter), 1, fp); fread(&biYPelsPerMeter, sizeof(biYPelsPerMeter), 1, fp); fread(&biClrUsed, sizeof(biClrUsed), 1, fp); fread(&biClrImportant, sizeof(biClrImportant), 1, fp); // RGB画像データ読み込む for (i=0; i<(int)biHeight; i++) for (j=0; j<(int)biWidth; j++) { for (k=0; k<3; k++) { //fread(&image[i][j][2-k], 1, 1, fp); fread(&image[biHeight-i][j][2-k], 1, 1, fp); } } fclose(fp); } //********************************************** // RGBカラー画像を256諧調白黒濃淡画像へ変換 * //********************************************** void BMPto256BW( unsigned char image[Y_SIZE][X_SIZE][3], unsigned char image_bw[Y_SIZE][X_SIZE] ) { int y, x, a; for (y=0; y<(int)biHeight; y++) for (x=0; x<(int)biWidth; x++) { a = (int)(0.3*image[y][x][0] + 0.59*image[y][x][1] + 0.11*image[y][x][2]); if (a<LOW) a = LOW; if (a>HIGH) a = HIGH; image_bw[y][x] = a; } } //***************************************** //各行の黒色判定 //***************************************** //**************************************** // 白黒濃淡画像配列のコピー * //**************************************** void imageCopyBW( unsigned char image1[Y_SIZE][X_SIZE], unsigned char image2[Y_SIZE][X_SIZE] ) { int x, y; for (y=0; y<(int)biHeight; y++) for (x=0; x<(int)biWidth; x++) image2[y][x] = image1[y][x]; } void main(void) { char input[100], output[100]; int intensity; printf("入力画像ファイル名(*.bmp):"); scanf("%s", input); readBMP(input, image_in); // 画像の入力,RGB24ビットカラーBMP画像を配列に格納 //一列各行の黒色の数出力 }

  • 画像処理について・・・・・・・・・・・

    #include<stdio.h> #include<stdlib.h> #define X_SIZE 512 #define Y_SIZE 512 unsigned char DATA[Y_SIZE][X_SIZE]; unsigned char O_DATA[Y_SIZE][X_SIZE]; char input_file_name[256]=”Lenna.raw”; char output_file_name[256]=”Lenna_out.raw”; void heikin(){ int x,u; int temp; for(y=1;y<Y_SIZE-1;y++){ for(x=1;x<X_SIZE-1;x++){ temp=・・・・・・・・・・・・・・・・・・・・・・・・; O_DATA[x][y]=(unsigned char)temp; } } } Int main (){ FILE*fp; If((fp=fopen(input_file_name,”rb”))==NULL){ Printf(“ファイルオ-プンエラ-\n”); Return 1; } Fread(DATA,sizeof(DATA),1,fp); fclose(fp); heikin(); if((fp=fopen(output_file_name,”wb”))==NULL{ printf(“ファイルオ-プンエラ-\n”); return 1; } Fwrite(O_DATA,sizeof(O_DATA),1,fp); Fclose(fp); Return 0; } ソースコードをやっているのですが、後、・・・・・・・・・の所を入力して完成なんですが、苦戦してます。 処理の内容としましては、 1、入力画像Lenna.rawを読み込んで、 2、平均値フィルタをかけ、 3、Lenna_out.rawに書き出す(保存する)したいんですが、公式みたいなのを入れればいいのでしょうか? すみませんが、お願いします。

  • segmentation fault

    ソースは以下です 途中までは実行されるんですけど,,, 教えてください #include <stdio.h> #include <stdlib.h> #include <math.h> #define M_PI 3.14159265358979 /* 円周率 */ int main(int argc, char **argv) { int xsize,ysize,depth,x,y,c; char code[10]; FILE *fp; unsigned char ***image,***outimage; double sum_kido,sum_kido_x,grad; int xmax,xmin,ymax,ymin,count; char grad_im; int sumx, sumy, N; char dummy[1024]; double Deltax; double Deltay; if(argc != 3){ fprintf(stderr,"Usage : a.out input_filename output_filename\n"); exit(1); } if((fp=fopen(argv[1],"r"))==NULL){ fprintf(stderr,"File can not open : %s\n",argv[1]); exit(1); } fscanf(fp,"%s",code); /* fscanf(fp,"%s",dummy); */ fscanf(fp,"%d %d",&xsize,&ysize); fscanf(fp,"%d ",&depth); fprintf(stderr,"%s, %d, %d, %d\n",code,xsize,ysize,depth); getchar(); image = (unsigned char ***)malloc(sizeof(unsigned char**)*ysize); for(y=0;y<ysize;y++){ image[y] = (unsigned char **)malloc(sizeof(unsigned char*)*xsize); for(x=0;x<xsize;x++){ image[y][x] = (unsigned char *)malloc(sizeof(unsigned char)*3); } } outimage = (unsigned char ***)malloc(sizeof(unsigned char**)*ysize); for(y=0;y<ysize;y++){ outimage[y] = (unsigned char **)malloc(sizeof(unsigned char*)*xsize); for(x=0;x<xsize;x++){ outimage[y][x] = (unsigned char *)malloc(sizeof(unsigned char)*3); } } // load image for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ for(c=0;c<3;c++){ image[y][x][c] = (unsigned char)(fgetc(fp)); printf("%d\n", image[y][x][c]); } } } fclose(fp); sumx = 0; sumy = 0; N = 0; for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ if((image[y][x][0]*2<image[y][x][2])&&(image[y][x][1]*2<image[y][x][2])){ outimage[y][x][0]=255; outimage[y][x][1]=0; outimage[y][x][2]=0; }else{ outimage[y][x][0]=image[y][x][0]; outimage[y][x][1]=image[y][x][1]; outimage[y][x][2]=image[y][x][2]; sumx += x; sumy += y, N += 1; } } } // output image if((fp=fopen(argv[2],"w"))==NULL){ fprintf(stderr,"File can not open : %s\n",argv[2]); exit(1); } fprintf(fp,"%s\n",code); fprintf(fp,"%d %d\n",xsize,ysize); fprintf(fp,"%d\n",depth); count = 0; for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ for(c=0;c<3;c++){ fputc(outimage[y][x][c],fp); } } } fclose(fp); fprintf(stdout, "%d, %d, %d, Gravity (x,y) = (%lf, %lf)\n",sumx,sumy,N,(double)(sumx)/(double)(N), (double)(sumy)/(double)(N)); for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ Deltax = sqrt(( pow (image[x+1][y][0] , 2.0 ) + pow (image[x+1][y][1] , 2.0 ) + pow (image[x+1][y][2] , 2.0 )) - ( sqrt( pow (image[x-1][y][0] , 2.0) + (image[x-1][y][1] , 2.0) + (image[x-1][y][2] , 2.0)))); Deltay = sqrt(( pow (image[x][y+1][0] , 2.0 ) + pow (image[x][y+1][1] , 2.0 ) + pow (image[x][y+1][2] , 2.0 )) - ( sqrt( pow (image[x][y-1][0] , 2.0) + (image[x][y-1][1] , 2.0) + (image[x][y-1][2] , 2.0)))); } } for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ double T = atan( Deltax / Deltay ); //勾配ベクトルの方向 double U = sqrt( pow ( Deltax , 2.0 ) + pow (Deltay , 2.0 ) ); //勾配ベクトルの勾配量  double V = atan( ( x - (double)(sumx) / (double)(N) ) / ( y - (double)(sumy) / (double)(N) ) ); printf(" %f\n " , V - ( T + ( M_PI / 2 ))); } } }

  • C言語でファイル読み書きを早くしたい。

    いつも利用させてもらって助かっています。 あるプログラムを作成しているのですが、ファイル入力の部分がネックとなってしまって、全体が使いものにならない状況に陥っています。 たくさんのデータをfread1回で読み込むことにより、読み込み速度はずいぶんと改善されましたが、まだ圧倒的に遅い状況です。システムコールを使いましたが、ほとんど改善されませんでした。 読み込み/書き込みの速度を改善する方法として,SSDメモリを使ったりする方法があると思いますが,プログラムの観点から改善できるところはないでしょうか? 下に、ファイル読み込みの部分だけ記述したコードを添付させて頂いたので、改善できる点があれば、御指摘頂けると助かります。 なお、前提として, (1)データはスタック領域だと不足するので、ヒープ領域に確保 (2)データファイルは改行無しの一連のデータ とします。 ちなみに、環境は OS   : CentOS5.3 memory   : 6GB コンパイラ : gcc です。 よろしくお願いします。 //----------------------------------------------------- //通常バージョン #include <stdio.h> #include <stdlib.h> #define SIZE (512*1024*1024) //500MB int main(void) { unsigned long int i; unsigned char *data; FILE *fp; data = (unsigned char *)malloc(SIZE); if(data == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } fp = fopen("filein.dat", "rb"); fread( data, sizeof( unsigned char), (int)SIZE, fp ); fclose(fp); /* //表示 for( i=0; i<SIZE; i++ ){ printf("%2x", data[i]); } puts(""); */ fp = fopen("fileout.dat", "w"); fwrite( data, sizeof( unsigned char), (int)SIZE, fp); fclose(fp); free(data); return 0; } //----------------------------------------------------- //readシステムコールを使ったバージョン #include <stdio.h> #include <stdlib.h> #define SIZE (512*1024*1024) //500MB int main(void) { unsigned long int i; unsigned char *data; data = (unsigned char *)malloc(SIZE); if(data == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } int fd; fd = open( "filein.dat" ); read( fd, data, sizeof(unsigned char)*SIZE); close(fd); /* //表示 for( i=0; i<SIZE; i++ ){ printf("%2x", data[i]); } puts(""); */ FILE *fp; fp = fopen("fileout.dat", "w"); fwrite( data, sizeof( unsigned char), (int)SIZE, fp); fclose(fp); free(data); return 0; }

  • C言語のファイル処理について

    環境 OS:Windows VISTA Ultimate コンパイラ:Borland C++ Compiler 5.5 Cの基礎的な勉強をしています。2つほど質問があります。 1つ目は、ファイル処理の勉強としてプログラムを作っているのですがファイルが上手く開けません。プログラムとしてはファイルを開いて、ファイル内に記述されている数値を取り出し、計算を行う簡単なものを作っています。ソースは以下のものになります。 #define N 256 int file_read(char filename[] , int count[]) { int m; FILE *fp; fp=fopen(filename,"r"); if(fp==NULL) { /* オープン失敗 */ printf("Not Found File\n"); return -1; /* 戻り値-1 */ } while((m = fgetc(fp)) != EOF) { 読み取った数値配列に格納する処理 } fclose(fp); return 0; } int operation(int count[]) { 計算処理 return 0; } int main(void) { int *count[N]; char *filename[256]; memset(count, 0, sizeof(count)); /* 変数・配列初期化 */ printf("Please Input Filename:"); fgets(filename, sizeof(filename), stdin ); if(file_read(filename,count) != -1) operation(count); return 0; }  バッファオーバーランの事を考え、fgetsによるキー入力にしたのですがファイルオープン失敗になってしまいます。fgetsのあと、変数filenameの中身を確認したところ、キー入力した文字はきちんと代入されていました。オープンするファイルはきちんとあるのですが・・。  fgetsをscanfに変えた場合は上手くいくので書式指定をしてscanfを使えばいいのでしょうが、なぜfgetsで上手くいかないでしょうか? 2つ目はgetchar()とfgets()に関してです。 while((c = getchar()) != EOF) { . .処理 . fgets(変数, sizeof(変数), stdin ); . .処理 . } とした場合、fgetsの処理が無視されてしまいます。 これはどういったことが原因なのでしょうか。 ご教授、お願いいたします。

  • C言語でbmp モノクロ画像の画像処理を行い、x・y・1or0 をtx

    C言語でbmp モノクロ画像の画像処理を行い、x・y・1or0 をtxtファイルに出力するプログラムを作らないといけないのですが、下記のプログラムのどこをいじればいいかわかりませんだれかお分かりになりませんか? #include <stdio.h> #include <process.h> #define COEF 0.1; #define X_CHORD_Max 512 #define Y_CHORD_Max 512 unsigned long *readBmp(char *filename); main() { unsigned long *pBmp; char input[64], output[64]; int x, y, k,n; char temp; float xCodnt,yCodnt; unsigned long hight, wight; unsigned int maskBit = 0x0080; /* Record the data*/ printf("Input file.bmp :"); scanf("%s", input); printf("output file.txt :"); scanf("%s", output); FILE *fpTxt; if((fpTxt=fopen(output,"wt"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } pBmp = readBmp(input); /* Read the Data*/ hight = *(pBmp+1); wight = *pBmp/32; pBmp += 2; for (y=0;y<hight; y++) { for (x=0; x<wight; x++) { for (k=0; k<4; k++) { temp =(char)*pBmp; for (n=0; n<8; n++) { if(temp & maskBit) { xCodnt = COEF; yCodnt =COEF; xCodnt = xCodnt*(x*32+k*8+n); yCodnt = yCodnt*y; fprintf(fpTxt,"G01 X%f Y%f\n",xCodnt,yCodnt); } maskBit >>= 1; } *pBmp >>= 8; maskBit = 0x0080; } pBmp ++; } } rewind(fpTxt); fclose(fpTxt); //END

  • icon format について

    Visual Studio.NET 2003 MFC を使用しています。 View画面で、アイコンを表示しようと思いました。 アイコン読み込みようのクラスを作成しました。 class icon { public: void IconHeadRead(FILE *fp,int *width,int *height) { unsigned char uc; unsigned short us; unsigned int ui; fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&uc,sizeof(unsigned char),1,fp);*width=uc; fread(&uc,sizeof(unsigned char),1,fp);*height=uc; fread(&uc,sizeof(unsigned char),1,fp); fread(&uc,sizeof(unsigned char),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&ui,sizeof(unsigned int),1,fp); }; void IconDataRead(FILE *fp,unsigned char *red,unsigned char *green,unsigned char *blue) { unsigned char uc; fread(&uc,sizeof(unsigned char),1,fp);*red=uc; fread(&uc,sizeof(unsigned char),1,fp);*green=uc; fread(&uc,sizeof(unsigned char),1,fp);*blue=uc; }; }; このred,green,blueの値を使用して、 SetPixelでドローしようと思いましたが、 変な表示になります。 width,heightは、正しいようです。 ICON フォーマットについて教えてください。 よろしくお願いします。 同じような要領で、bitmapは保存、読み込みはできました。

  • pgm画像入出力(C言語)

    画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは2倍に変換していますが、そこは重要ではなく、入出力さえできればいいです。 OS:windows 文字コード:色々試したけどダメ。試してないものもあるかも。 プログラム #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } コンパイル方法(cygwin) ./a 入力画像.pgm 出力画像.pgm

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

このQ&Aのポイント
  • 機種MFC-J730DNのコピー設定で画質が標準に設定できない問題が発生しています。この問題により、コピーに時間がかかりすぎて困っています。
  • MFC-J730DNのコピー設定で高画質設定が固定になっており、画質を標準に設定することができません。このため、コピーに時間がかかりすぎて困っています。
  • ブラザー製品のMFC-J730DNのコピー設定で画質が標準に設定できない問題があります。高画質設定が固定になっているため、コピーに時間がかかりすぎてしまい困っています。
回答を見る

専門家に質問してみよう