原理见站内帖
Final CODE:
/*
源自https://www.bilibili.com/read/cv10341477/
*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
//-----打开文件 -----
FILE* fp, * nfp;
char file_name[] = "image/t2.bmp";
char new_file_name[] = "image/gray2.bmp";
if ((fp = fopen(file_name, "rb")) == NULL) {
printf("OPEN IMG FAILED\n");
exit(0);
}
if ((nfp = fopen(new_file_name, "wb")) == NULL) {
printf("OPEN NIMG FAILED\n");
exit(0);
}
//-----处理图像-----
unsigned char buffer[54], temp[3], rgb[3], ave;//保存图像头信息的指针 ,注意用unsigned!!!
//step1处理头信息?
if (fread(buffer, 1, 54, fp) != 54) {
printf("读取图像头信息失败!\n");
system("pause");
}
if (fwrite(buffer, 1, 54, nfp) != 54) {
printf("写入图像头信息失败!\n");
system("pause");
}
printf("头信息写入成功!\n");
//step2处理RGB?
int src_len;
fseek(fp, 0, SEEK_END);
src_len = ftell(fp);
fseek(fp, 54, SEEK_SET);
src_len -= 54;
for (int i = 0; i < src_len; i += 3) {
fread(temp, 1, 3, fp);
ave = (temp[0] + temp[1] + temp[2]) / 3;
rgb[0] = rgb[1] = rgb[2] = ave;
fwrite(rgb, 1, 3, nfp);
}
printf("灰度图像生成完毕!\n");
//----关闭文件 ----
fclose(fp);
fclose(nfp);
system("pause");
return 0;
}
False:
for(i = 0; i < src_len; i += 3)
{
//得到B,G,R三色的数值
blue = fgetc(fp_src);
green = fgetc(fp_src);
red = fgetc(fp_src);
//灰度转换的通用公式
gray = (red * 0.3 + green * 0.59 + blue * 0.11);
//写入数据
fputc(gray, fp_dst);
fputc(gray, fp_dst);
fputc(gray, fp_dst);
}
上述代码在Windows环境下,fgetc/fputc不能正常工作,原因未知,输出像素一定数量后会全为0。
但Linux环境下正常运行。