bmpファイルを読み込み、コマンドライン引数で指定した範囲のみを黒く塗りつぶすプログラムを分割コンパイルで実装することを想定しています。
ですが、gcc main.c read.c write.c erase.c -o mainでコンパイルし、./main 50 200 250 350で実行した結果、bmpファイルが黒塗りの画像となって出力されてしまいました。
またerase.cのout[i][j][0] = 0、out[i][j][1] = 0、out[i][j][2] = 0の値を全て255に変更し、白色で塗りつぶすプログラムにしてみた所、黒塗りの画像にコマンドライン引数で指定した範囲のみが白色で塗りつぶされた画像が出力されました。
上記の試行から、プログラム内のどこかで一度画像全体を黒で塗りつぶす操作が行われており、そこを修正すれば指定した範囲のみが塗りつぶされ、指定範囲外は元のbmpファイルを維持した状態で出力される、と考えられるのですが、件の問題があるであろう箇所を特定することができませんでした。
どこに不備があるのか教えていただけないでしょうか。
c
1/*main.c*/ 2 3#include <stdio.h> 4#include <stdlib.h> 5#include "imagedata.h" 6 7extern int erase( int x1, int x2, int y1, int y2 ); 8 9unsigned char img[HEIGHT][WIDTH][3]; 10unsigned char out[HEIGHT][WIDTH][3]; 11unsigned char header[54]; 12 13int main(int argc, char** argv) 14{ 15 int x[2]; 16 int y[2]; 17 int i; 18 19 for( i = 0; i < 2; i++) 20 { 21 x[i] = atoi(argv[i+1]); 22 y[i] = atoi(argv[i+3]); 23 if( x[i] > HEIGHT ) x[i] = 400; 24 if( y[i] > WIDTH ) y[i] = 400; 25 } 26 27 read_image("in.bmp"); 28 29 erase((int)x[0], 30 (int)x[1], 31 (int)y[0], 32 (int)y[1]); 33 34 write_image("out.bmp"); 35 36 return 0; 37} 38 39/*imagedata.h*/ 40 41#define HEIGHT 400 42#define WIDTH 400 43 44extern unsigned char img[HEIGHT][WIDTH][3]; 45extern unsigned char out[HEIGHT][WIDTH][3]; 46extern unsigned char header[54]; 47 48extern int read_image(char* filename); 49extern int write_image(char* filename); 50 51/*erase.c*/ 52 53#include <stdio.h> 54#include "imagedata.h" 55 56int erase( int x1, int x2, int y1, int y2 ) 57{ 58 int i, j; 59 60 for( i = y1; i < y2; i++ ) 61 { 62 for( j = x1; j < x2; j++) 63 { 64 out[i][j][0] = 0; 65 out[i][j][1] = 0; 66 out[i][j][2] = 0; 67 } 68 } 69 70 return 0; 71} 72 73/*write.c*/ 74 75#include <stdio.h> 76#include "imagedata.h" 77 78int write_image(char* filename) 79{ 80 FILE *fw; 81 int i, j; 82 83 fw = fopen(filename, "wb"); 84 85 if( fw == NULL ){ 86 printf("Cannot open file\n"); 87 return 1; 88 } 89 90 fwrite(header, sizeof(unsigned char), 54, fw); 91 92 for( i = 0; i < HEIGHT; i++ ){ 93 for( j = 0; j < WIDTH; j++ ){ 94 fwrite(out[i][j], sizeof(unsigned char), 3, fw); 95 } 96 } 97 98 fclose(fw); 99 100 return 0; 101} 102 103/*read.c*/ 104 105#include <stdio.h> 106#include "imagedata.h" 107 108int read_image(char* filename) 109{ 110 FILE *fr; 111 int i, j; 112 113 fr = fopen(filename, "rb"); 114 115 if( fr == NULL ){ 116 printf("Cannot open file\n"); 117 return 1; 118 } 119 120 fread(header, sizeof(unsigned char), 54, fr); 121 122 for( i = 0; i < HEIGHT; i++ ){ 123 for( j = 0; j < WIDTH; j++ ){ 124 fread(img[i][j], sizeof(unsigned char), 3, fr); 125 } 126 } 127 128 fclose(fr); 129 130 return 0; 131}
回答2件
あなたの回答
tips
プレビュー