[ create a new paste ] login | about

Link: http://codepad.org/aZQ11cox    [ raw code | output | fork ]

C, pasted on Nov 29:
#define WIDTH 640
#define HEIGHT 480

#include<stdio.h>
#include<stdlib.h>

typedef struct color{
	unsigned char r;
	unsigned char g;
	unsigned char b;
}COLOR;

COLOR data[WIDTH][HEIGHT];

unsigned char graydata[WIDTH][HEIGHT];

int main(){
	int i, j;
	FILE *fp;
	FILE *out;

	char header[54];

	if((fp = fopen("image.bmp", "rb")) == NULL){
		fprintf(stderr, "file open error");
		exit(1);
	}
	if((out = fopen("out.bmp", "wb")) == NULL){
		fprintf(stderr, "file open error");
		exit(1);
	}

	fread(header, 1, 54, fp);

	for(j=HEIGHT-1; j>=0; j--){
		for(i=0; i<WIDTH; i++){
			data[i][j].b = getc(fp);
			data[i][j].g = getc(fp);
			data[i][j].r = getc(fp);
		}
	}

	fclose(fp);

	for(i=0; i<WIDTH; i++){
		for(j=0; j<HEIGHT; j++){
			graydata[i][j] = (data[i][j].r + data[i][j].g + data[i][j].b) / 3;
		}
	}

    // 輝度平均算出
    int sum = 0;
    for(j=0; j<HEIGHT; j++){
        for (i=0; i<WIDTH; i++){
            // r, g, b は全て同じ値が入っているものと仮定
			sum += data[j][i].g;
        }
    }

    // 2値変換
	int average = sum/(WIDTH*HEIGHT);
    for(j=0; j<HEIGHT; j++){
        for(i=0; i<WIDTH; i++) {
			if (data[j][i].g < average){
				data[j][i].r = data[j][i].g = data[j][i].b = 0;
			}else{
				data[j][i].r = data[j][i].g = data[j][i].b = 255;
            }
        }
    }

	fwrite(header, 1, 54, out);

	for(j=HEIGHT-1; j<=0; j--){
		for(i=0; i<WIDTH; i++){
			fputc(data[i][j].b, out);
			fputc(data[i][j].g, out);
			fputc(data[i][j].r, out);
		}
	}

	fclose(out);

	return 0;
}


Output:
1
file open error


Create a new paste based on this one


Comments: