1、课设目的:加深对C语言编程的理解,训练用C语言完成简单算法设计的能力
2、基本要求:熟悉C语言中的基本知识,如数组、指针、结构体、文件读写等,
3、注意事项:注意区分函数的声明、定义、调用,函数名、变量名尽可能望文知义
4、良好习惯:将函数的声明、常量的定义等放在统一的头文件中,主函数结构尽可能简洁,
通过调用子函数实现各类算法,每个算法对应单独的源文件
5、基本任务:其中①②③必做,④和⑤选做
①学习bmp图像文件的结构,打印出文件头和信息头各字段
②完成灰度图的旋转(逆时针或顺时针90度)
③中值滤波;
④边缘检测;
⑤打马赛克。
在下面的主函数中编写代码实现这些操作,跪求大佬!!!!!
- #include "stdafx.h"
- #include "bmpHeader.h"
- int main()
- {
- ClImage* img = BmpLoadImage("lena.bmp");//读图
- unsigned char * ptImData = img->imageData;//由于指针img->imageData可能会移动,所以定义另一个指针,与最初的img->imageData指向同一块空间
- unsigned char ** imData = (unsigned char **)malloc(sizeof(unsigned char*) * img->height);//分配指针数组
- imData[0] = (unsigned char *)malloc(sizeof(unsigned char) * img->height * img->width);//一次性分配所有空间
- //将一维数组"视为"二维数组,并指定每一行的首地址(否则无法当二维数组使用,注意,仅仅是当二维数组使用而已)
- for (int i = 1; i< img->height; i++)//论这两句的必要性
- imData[i] = imData[i-1] + img->width;
- if (img->channels == 3)//如果是RGB图,则转为灰度图,RGB图像转为灰度图的计算公式:Gray = R*0.299 + G*0.587 + B*0.114
- {
- for (int i = 0; i < img->height; i++)
- for (int j = 0; j < img->width; j++)
- imData[i][j] = int((float)(*img->imageData++) * 0.114 +
- (float)(*img->imageData++) * 0.587 +
- (float)(*img->imageData++) * 0.299);
- }
- else if (img->channels == 1) //如果是灰度图,则直接copy
- memcpy(imData, img->imageData, img->height * img->width);//内存copy有什么好处?
- img->channels = 1;//最后待处理的图像是灰度图,即单通道的
- img->imageData = imData[0];//保存灰度图
- bool flag = BmpSaveImage("grayed.bmp", img);
- if (flag)
- {
- printf("grayed.bmp saved... nn");
- }
- return 0;
- //此处附加引用代码
- }