#include <stdlib.h>
#define write_path "output.bmp" //輸出圖檔的檔名
void GCS(const char*, const char*); //global contrast stretching(全域對比調整)
int main(void)
{
char select[10];
char exit[5] = "exit";
while(1){
printf("請輸入圖片檔名(包含副檔名,例: input.bmp),輸入exit為結束: ");
scanf("%s", &select);
if(strcmp(select, exit) == 0){
printf("程式結束!\n") ;
system("PAUSE");
return 0;
}
GCS(select, write_path);
}
return 0;
}
void GCS(const char *input, const char *output){
unsigned char bmp_head[54]={0}; //存放bmp的標頭檔
unsigned char *data_buf; //BMP的資料
unsigned int i,j;
unsigned int width=0, high=0; //BMP圖檔的寬與高
unsigned int bmp_w; //BMP資料陣列每一列長度
int max=0, min=255;
char exit[] = "exit";
FILE *fp1; //輸入檔
FILE *fp2; //輸出檔
fp1 = fopen(input, "rb" ); //讀取二進位圖檔並寫入
fp2 = fopen(output, "w+b" ); //新建二進位檔並讀取寫入
if(fp1 == NULL){
printf("檔案找不到!\n");
return;
}
fread(bmp_head,54,1,fp1); //讀取來源標頭檔
fwrite(bmp_head,54,1,fp2); //寫入標頭檔至fp2
//從標頭檔讀出BMP圖檔寬度及高度 (單位:像素)
width = *(bmp_head+18) + 256*(*(bmp_head+19)) + 256*256*(*(bmp_head+20)) + 256*256*256*(*(bmp_head+21));
high = *(bmp_head+22) + 256*(*(bmp_head+23)) + 256*256*(*(bmp_head+24)) + 256*256*256*(*(bmp_head+25));
printf("%d\n", *(bmp_head+28));
printf("%d %d %d %d\n", *(bmp_head+18),*(bmp_head+19),*(bmp_head+20),*(bmp_head+21));
printf("%d %d %d %d\n", *(bmp_head+22),*(bmp_head+23),*(bmp_head+24),*(bmp_head+25));
printf("%d %d\n", width,high);
//BMP資料陣列每一列長度為:
//像素寬度X顏色深度,即width*3(以24bits的BMP為例)
bmp_w=width*3;
//每一列長度須為4的倍數,所以要加上4-(width*3)%4
if(bmp_w % 4) bmp_w += 4-(bmp_w % 4);
//跟系統要BMP資料陣列一列長度的記憶體
data_buf = (unsigned char *) malloc(sizeof(unsigned char)*bmp_w);
for(i=0; i<high; i++){
fread(data_buf, bmp_w, 1, fp1); //每次從fp1讀取一列BMP陣列至data_buf
for(j=0; j<width; j++){
if(data_buf[j] > max) max = data_buf[j];
if(data_buf[j] < min) min = data_buf[j];
}
}
fp1 = fopen(input, "r+b");
fread(bmp_head,54,1,fp1);
for(i=0; i<high; i++){
fread(data_buf, bmp_w, 1, fp1); //每次從fp1讀取一列BMP陣列至data_buf
for(j=0; j<width*3; j+=3){
data_buf[j] = 255*(data_buf[j+2]-min)/(max-min);
data_buf[j+1] = 255*(data_buf[j+1]-min)/(max-min);
data_buf[j+2] = 255*(data_buf[j]-min)/(max-min);
}
fwrite(data_buf,bmp_w,1,fp2); //將data_buf存入fp2檔
}
fclose(fp1);
fclose(fp2);
printf("Local contrast stretching處理完成!\n請開啟檔案 "write_path"\n\n");
}