From df85a8810bbd9530bd3b389f6d47750bef9b9cbd Mon Sep 17 00:00:00 2001 From: SunnyGor Date: Fri, 13 Jan 2023 18:56:00 +0800 Subject: [PATCH] v4 --- output/bw2x3(output).bmp | Bin 66 -> 134 bytes tempCodeRunnerFile.c | 2 - test/hello.bmp | Bin 172938 -> 0 bytes test/image.cpp | 619 --------------------------------------- test/image.h | 60 ---- test/main.cpp | 75 ----- test/struct.h | 35 --- transfer.exe | Bin 45090 -> 45090 bytes try.c | 117 ++++---- try.exe | Bin 47854 -> 47938 bytes 10 files changed, 62 insertions(+), 846 deletions(-) delete mode 100644 tempCodeRunnerFile.c delete mode 100644 test/hello.bmp delete mode 100644 test/image.cpp delete mode 100644 test/image.h delete mode 100644 test/main.cpp delete mode 100644 test/struct.h diff --git a/output/bw2x3(output).bmp b/output/bw2x3(output).bmp index 1bd6edb1a84a505910a8b2391b55e061312ed022..e1b18308e754500649d74f4f993bdbe18ad513bf 100644 GIT binary patch literal 134 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 AX#fBK diff --git a/test/image.cpp b/test/image.cpp deleted file mode 100644 index 2a90733..0000000 --- a/test/image.cpp +++ /dev/null @@ -1,619 +0,0 @@ -#include "image.h" -#include -#include -#include -#include -using namespace std; -//普通构造函数 -Image::Image(int h, int w) :height(h), width(w) -{ - this->height = h; - this->width = w; - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < this->height; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(this->width * 3); - // 读取像素数据 - for (int j = 0; j < this->width; j++) - { - data[i][j] = 0; - } - } -} -Image::Image(int h, int w, unsigned char val)//创建的图像像素值都为val; -{ - this->height = h; - this->width = w; - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < this->height; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(this->width * 3); - // 读取像素数据 - for (int j = 0; j < this->width; j++) - { - data[i][j] = val; - } - } -} -Image::Image(const char* ImageName)//利用文件名从硬盘加载图像文件成为Image对象; -{ - this->ReadBMP(ImageName); -} -Image::Image(unsigned char *m, int rows, int cols)//从一维静态数组创建Image对象,图像的行数和列数由后面两个参数给出; -{ - this->height = rows; - this->width = cols; - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < this->height; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(this->width * 3); - // 读取像素数据 - for (int j = 0; j < this->width; j++) - { - data[i][j] = *m; - m++; - } - } -} -Image::Image(unsigned char m[][100], int rows)//从静态二维数组创建Image对象,图像的行数(二维数组的第一个维度)由第二个参数rows给出; -{ - this->height = rows; - this->width = 100; - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < this->height; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(this->width * 3); - // 读取像素数据 - for (int j = 0; j < this->width; j++) - { - data[i][j] = m[i][j]; - } - } -} -Image::Image(unsigned char **m, int h, int w)//从动态数组(二级指针)创建Image对象,图像的行数和列数由后面两个参数给出; -{ - this->height = h; - this->width = w; - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * this->height); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < this->height; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(this->width * 3); - // 读取像素数据 - for (int j = 0; j < this->width; j++) - { - data[i][j] = m[i][j]; - } - } -} -//拷贝构造函数 -Image::Image(Image &im) -{ - if (this->data) - { - delete[] this->data; - this->data = NULL; - } - - *this = im; -} - - -//释放堆区数据 -void Image::myFree(unsigned char** data, int h) -{ - for (int i = 0; i < h; i++) - { - free(data[i]); - data[i] = NULL; - } - free(data); - data = NULL; - puts("释放堆区数据"); -} -//析构函数 -Image::~Image() -{ - this->myFree(this->data, this->height); -} - - -//从硬盘读入图像文件,存储到image类中 -void Image::ReadBMP(const char* filename) -{ - FILE* fp = NULL; // C标准库的文件指针 - fp = fopen(filename, "rb"); // 二进制读取方式打开文件 - - // 读取文件头 - fread(&bmpfileheader, sizeof(bmpfileheader), 1, fp); - // 读取信息头 - fread(&bitmapinfoheader, sizeof(bitmapinfoheader), 1, fp); - - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(bitmapinfoheader.biWidth * 3); - // 读取像素数据 - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - fread(&data[i][j], 1, 1, fp); - } - } - this->height = this->bitmapinfoheader.biHeight; - this->width = this->bitmapinfoheader.biWidth; - printf("height = %d width = %d\n",this->height,this->width); - - // 关闭读取的文件 - fclose(fp); -} - - -//保存bmp图像 -void Image::WriteBMP(const char *filename) -{ - FILE* fp = NULL; // 保存文件的文件指针 - fp = fopen(filename, "wb"); // 二进制写入方式打开文件 - // 写入文件头 - fwrite(&bmpfileheader, sizeof(bmpfileheader), 1, fp); - // 写入信息头 - fwrite(&bitmapinfoheader, sizeof(bitmapinfoheader), 1, fp); - // 写入数据 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - fwrite(data[i], bitmapinfoheader.biWidth * 3, 1, fp); - } - // 关闭写入的文件 - fclose(fp); -} -//保存bmp图像 -void Image::WriteBMP(const char *filename, unsigned char** data) -{ - FILE* fp = NULL; // 保存文件的文件指针 - fp = fopen(filename, "wb"); // 二进制写入方式打开文件 - // 写入文件头 - fwrite(&bmpfileheader, sizeof(bmpfileheader), 1, fp); - // 写入信息头 - fwrite(&bitmapinfoheader, sizeof(bitmapinfoheader), 1, fp); - // 写入数据 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - fwrite(data[i], bitmapinfoheader.biWidth * 3, 1, fp); - } - // 关闭写入的文件 - fclose(fp); -} -//保存bmp图像 -void Image::WriteBMP(const char *filename, unsigned char** t_data, - BMPFILEHEADER bmpfileheader, BITMAPINFOHEADER t_bitmapinfoheader) -{ - FILE* fp = NULL; // 保存文件的文件指针 - fp = fopen(filename, "wb"); // 二进制写入方式打开文件 - // 写入文件头 - fwrite(&bmpfileheader, sizeof(bmpfileheader), 1, fp); - // 写入信息头 - fwrite(&t_bitmapinfoheader, sizeof(t_bitmapinfoheader), 1, fp); - // 写入数据 - for (int i = 0; i < t_bitmapinfoheader.biHeight; i++) - { - fwrite(t_data[i], t_bitmapinfoheader.biWidth * 3, 1, fp); - } - // 关闭写入的文件 - fclose(fp); -} - - -//从文本文件读取 -void Image::ReadText(const char* filename) -{ - FILE* fp = NULL; // C标准库的文件指针 - fp = fopen(filename, "rb"); // 二进制读取方式打开文件 - - fread(&bitmapinfoheader.biHeight, sizeof(bitmapinfoheader.biHeight), 1, fp); - fread(&bitmapinfoheader.biWidth, sizeof(bitmapinfoheader.biWidth), 1, fp); - - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - data = (unsigned char **)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - //注意3通道,每个像素3个字节 - data[i] = (unsigned char *)malloc(bitmapinfoheader.biWidth * 3); - // 读取像素数据 - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - fread(&data[i][j], 1, 1, fp); - } - } - - // 关闭读取的文件 - fclose(fp); -} -//保存成文本文件 -void Image::WriteText(const char *filename) -{ - FILE* fp = NULL; // 保存文件的文件指针 - fp = fopen(filename, "wb"); // 二进制写入方式打开文件 - // 写入信息头 - fwrite(&bitmapinfoheader.biHeight, sizeof(bitmapinfoheader.biHeight), 1, fp); - fwrite(&bitmapinfoheader.biWidth, sizeof(bitmapinfoheader.biWidth), 1, fp); - // 写入数据 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - fwrite(data[i], bitmapinfoheader.biWidth * 3, 1, fp); - } - // 关闭写入的文件 - fclose(fp); -} - - -//获取图像中指定点的值 -unsigned char& Image::At(int row, int col) -{ - return this->data[row * 3][col * 3]; -} -//设置像素(row,col)为某值 -void Image::Set(int row, int col, unsigned char value) -{ - //重新读取数据 - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - t_data[i][j] = data[i][j]; - } - } - //修改像数值 - for (int i = 0; i < 3; i++) - { - t_data[row * 3 + i][col * 3 + i] = value; - } - //保存图像 - this->WriteBMP("setImg.bmp", t_data); - myFree(t_data, bitmapinfoheader.biHeight); -} -//设置图像所有像素为同一值 -void Image::Set(unsigned char value) -{ - //重新读取数据 - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - t_data[i][j] = data[i][j]; - } - } - //修改像数值 - for (int i = 0; i < this->bitmapinfoheader.biHeight; i++) - { - for (int j = 0; j < this->bitmapinfoheader.biWidth * 3; j++) - { - t_data[i][j] = value; - } - } - //保存图像 - this->WriteBMP("setAllImg.bmp", t_data); - myFree(t_data, bitmapinfoheader.biHeight); -} - - -//false 左右,true 上下 -void Image::Flip(int code) -{ - //重新读取数据 - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - t_data[i][j] = data[i][j]; - } - } - - if (code) - { - //上下翻转图片 - for (int i = 0; i < bitmapinfoheader.biHeight / 2; i++) - { - unsigned char* temp = t_data[i]; - t_data[i] = t_data[bitmapinfoheader.biHeight - 1 - i]; - t_data[bitmapinfoheader.biHeight - 1 - i] = temp; - } - this->WriteBMP("flipImageUpDown.bmp",t_data); - } - else - { - //左右翻转图片 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - for (int j = 0; j < bitmapinfoheader.biWidth * 3 / 2; j += 3) - { - unsigned char temp = t_data[i][j]; - t_data[i][j] = t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 2]; - t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 2] = temp; - - unsigned char temp1 = t_data[i][j+1]; - t_data[i][j + 1] = t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 1]; - t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j - 1] = temp1; - - unsigned char temp2 = t_data[i][j + 2]; - t_data[i][j+2] = t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j]; - t_data[i][bitmapinfoheader.biWidth * 3 - 1 - j] = temp2; - } - } - this->WriteBMP("flipImageLeftRight.bmp",t_data); - } - - this->myFree(t_data, this->bitmapinfoheader.biHeight); -} - - -//图像缩小,放大 -//false缩小,true放大 -void Image::Resize(int code) -{ - if (code)//放大 - { - /* * - *难点主要在于对索引的控制, - *因为这里需要两个索引控制四个变量,需要找到它们对应的关系式 - */ - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight * 2); - for (int i = 0; i < bitmapinfoheader.biHeight ; i++) - { - t_data[2 * i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3 * 2); - for (int j = 0; j < bitmapinfoheader.biWidth; j++) - { - t_data[2 * i][6 * j] = data[i][3 * j]; - t_data[2 * i][6 * j + 1] = data[i][3 * j + 1]; - t_data[2 * i][6 * j + 2] = data[i][3 * j + 2]; - - t_data[2 * i][6 * j + 3] = data[i][3 * j]; - t_data[2 * i][6 * j + 3 + 1] = data[i][3 * j + 1]; - t_data[2 * i][6 * j + 3 + 2] = data[i][3 * j + 2]; - } - - t_data[2 * i + 1] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3 * 2); - for (int j = 0; j < bitmapinfoheader .biWidth * 6; j++) - { - t_data[2 * i + 1][j] = t_data[2 * i][j]; - } - } - - BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; - BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; - - t_bitmapinfoheader.biHeight *= 2; - t_bitmapinfoheader.biWidth *= 2; - t_bitmapinfoheader.biSizeImage *= 4; - - this->WriteBMP("magnifyImage.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); - this->myFree(t_data, t_bitmapinfoheader.biHeight);//释放内存 - } - else//缩小 - { - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight / 2); - for (int i = 0; i < bitmapinfoheader.biHeight / 2; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3 / 2); - for (int j = 0, index = 0; j < bitmapinfoheader.biWidth / 2; j++) - { - t_data[i][index++] = data[2 * i][6 * j]; - t_data[i][index++] = data[2 * i][6 * j + 1]; - t_data[i][index++] = data[2 * i][6 * j + 2]; - } - } - - BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; - BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; - - t_bitmapinfoheader.biHeight /= 2; - t_bitmapinfoheader.biWidth /= 2; - t_bitmapinfoheader.biSizeImage /= 4; - - this->WriteBMP("shrinkImage.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); - this->myFree(t_data, t_bitmapinfoheader.biHeight);//释放内存 - } -} - - -//图像裁剪的函数 -void Image::Cut(int x1, int y1, int x2, int y2) -{//裁剪点(x1,y1)到点(x2,y2)的图像——(0,120) (512,360) h = y2 - y1 = 240, w = x2 - x1 = 512 - if (x2 > x1 && y2 > y1) - { - int h = y2 - y1 + 1; - int w = x2 - x1 + 1; - while (w % 4) - { - w++; - } - //重新载入数据 - unsigned char **t_data = (unsigned char**)malloc(h * sizeof(unsigned char*)); - //m,n控制t_data的下标,i,j控制data下标 - for (int i = y1,m = 0; i <= y2; i++, m++) - { - t_data[m] = (unsigned char*)malloc(w * 3); - memset(t_data[m],0, w * 3); - for (int j = x1*3, n = 0; j <= x2*3 + 2; j++, n++) - { - t_data[m][n] = data[i][j]; - } - } - //重新载入头文件 - BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; - BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; - t_bitmapinfoheader.biHeight = h; - t_bitmapinfoheader.biWidth = w; - //通过公式重新计算biSize - t_bitmapinfoheader.biSizeImage = (((w*t_bitmapinfoheader.biBitCount) + 31) / 32 * 4)*h; - //保存数据 - WriteBMP("cutImage.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); - //释放数据 - myFree(t_data, h); - } - else - { - puts("输入坐标有误"); - } -} - - -//图像旋转的函数 -void Image::Rotate(int degree)//图像旋转的函数(简单起见,旋转角度为90度的整数倍) -{ - BMPFILEHEADER t_bmpfileheader = this->bmpfileheader; - BITMAPINFOHEADER t_bitmapinfoheader = this->bitmapinfoheader; - if (degree == 90) - { - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biWidth); - for (int i = 0; i < bitmapinfoheader.biWidth; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biHeight * 3); - for (int j = 0; j < bitmapinfoheader.biHeight; j++) - { - t_data[i][j * 3] = data[bitmapinfoheader.biHeight - j - 1][3 * i]; - t_data[i][j * 3 + 1] = data[bitmapinfoheader.biHeight - j - 1][3 * i + 1]; - t_data[i][j * 3 + 2] = data[bitmapinfoheader.biHeight - j - 1][3 * i + 2]; - } - } - //重写信息头 - t_bitmapinfoheader.biHeight = this->bitmapinfoheader.biWidth; - t_bitmapinfoheader.biWidth = this->bitmapinfoheader.biHeight; - //保存图片 - this->WriteBMP("rotate90.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); - this->myFree(t_data, t_bitmapinfoheader.biHeight); - } - else if (degree == 180) - { - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biWidth * 3); - for (int j = 0; j < bitmapinfoheader.biWidth; j++) - { - t_data[i][j * 3] = data[bitmapinfoheader.biHeight - i - 1][bitmapinfoheader.biWidth * 3 - j * 3 - 3]; - t_data[i][j * 3 + 1] = data[bitmapinfoheader.biHeight - i - 1][bitmapinfoheader.biWidth * 3 - j * 3 - 3 + 1]; - t_data[i][j * 3 + 2] = data[bitmapinfoheader.biHeight - i - 1][bitmapinfoheader.biWidth * 3 - j * 3 - 3 + 2]; - } - } - //保存图片 - this->WriteBMP("rotate180.bmp", t_data); - this->myFree(t_data, t_bitmapinfoheader.biHeight); - } - else if (degree == 270) - { - unsigned char** t_data = (unsigned char**)malloc(sizeof(unsigned char*) * bitmapinfoheader.biWidth); - for (int i = 0; i < bitmapinfoheader.biWidth; i++) - { - t_data[i] = (unsigned char*)malloc(bitmapinfoheader.biHeight * 3); - for (int j = 0; j < bitmapinfoheader.biHeight; j++) - { - t_data[i][j * 3] = data[j][bitmapinfoheader.biWidth * 3 - 3 -i * 3]; - t_data[i][j * 3 + 1] = data[j][bitmapinfoheader.biWidth * 3 - 3 - i * 3 + 1]; - t_data[i][j * 3 + 2] = data[j][bitmapinfoheader.biWidth * 3 - 3 - i * 3 + 2]; - } - } - //重写信息头 - t_bitmapinfoheader.biHeight = this->bitmapinfoheader.biWidth; - t_bitmapinfoheader.biWidth = this->bitmapinfoheader.biHeight; - //保存图片 - this->WriteBMP("rotate270.bmp", t_data, t_bmpfileheader, t_bitmapinfoheader); - this->myFree(t_data, t_bitmapinfoheader.biHeight); - } - else - { - puts("输入的角度不符合要求"); - } -} - - -//求均值方差 -void Image::Mean_Variance(float &m, float &var)//求图像的均值和方差,利用参数输出 -{ - float sum = 0; - float ave = 0; - float vSum = 0; - float vAve = 0; - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - sum += this->data[i][j]; - } - } - ave = sum / (bitmapinfoheader.biHeight*bitmapinfoheader.biWidth * 3); - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - vSum += (data[i][j] - ave)*(data[i][j] - ave); - } - } - vAve = vSum / (bitmapinfoheader.biHeight*bitmapinfoheader.biWidth * 3); - - m = ave; - var = vAve; -} - - -Image& Image::operator=(Image& val)//重载操作符 -{ - this->bitmapinfoheader = val.bitmapinfoheader; - this->bmpfileheader = val.bmpfileheader; - this->height = val.height; - this->width = val.width; - // 动态分配二维数组存储像素数据,注意先申请一个存放指针的数组, - this->data = (unsigned char **)malloc(sizeof(unsigned char*) * bitmapinfoheader.biHeight); - //其大小为sizeof(unsigned char*) * bitmapinfoheader.biHeight,这点很容易错 - //申请行指针 - for (int i = 0; i < bitmapinfoheader.biHeight; i++) - { - //注意3通道,每个像素3个字节 - this->data[i] = (unsigned char *)malloc(bitmapinfoheader.biWidth * 3); - // 读取像素数据 - for (int j = 0; j < bitmapinfoheader.biWidth * 3; j++) - { - this->data[i][j] = val.data[i][j]; - } - } - - return *this; -} - - -//实现友元函数,交换两个Image对象的数据 -void Swap(Image &a, Image &b) -{ - Image t(a); - a = b; - b = t; -} diff --git a/test/image.h b/test/image.h deleted file mode 100644 index fbbf861..0000000 --- a/test/image.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef IMAGE_H -#define IMAGE_H -#include "struct.h" - -class Image -{ -public: - //构造函数及其重载 - Image(){}//创建行列都为零的Image对象 - Image(int h, int w);//创建h行,w列的Image对象 - Image(int h, int w, unsigned char val); //创建的图像像素值都为val; - Image(const char* ImageName); //利用文件名从硬盘加载图像文件成为Image对象; - Image(unsigned char *m, int rows, int cols); //从一维静态数组创建Image对象,图像的行数和列数由后面两个参数给出; - Image(unsigned char m[][100], int rows); //从静态二维数组创建Image对象,图像的行数(二维数组的第一个维度)由第二个参数rows给出; - Image(unsigned char **m, int h, int w); //从动态数组(二级指针)创建Image对象,图像的行数和列数由后面两个参数给出; - Image(Image &im); //拷贝构造函数; - ~Image(); //析构函数; - - - void ReadBMP(const char* filename); //从BMP文件中读入图像数据; - void WriteBMP(const char* filename); //将图像数据保存为BMP图像文件; - void WriteBMP(const char *filename, unsigned char** data);//翻转时写图片 - void WriteBMP(const char *filename, unsigned char** data,//放缩时写图片 - BMPFILEHEADER bmpfileheader, BITMAPINFOHEADER bitmapinfoheader); - - - void ReadText(const char* filename); //从文本文件中读入图像数据; - void WriteText(const char* filename); //将图像数据保存为文本文件; - - - unsigned char& At(int row, int col); //获取第row行第col列的像素点的值; - void Set(int row, int col, unsigned char value); //设置像素(row,col)为某值; - void Set(unsigned char value); //设置图像所有像素为同一值; - - - void Flip(int code); //图像的翻转; 根据code的值:0:左右翻转,1:上下翻转; - void Resize(int code); //图像的缩放;根据code的值:0:缩小一倍,1:放大一倍; - - - void Cut(int x1, int y1, int x2, int y2);//裁剪点(x1,y1)到点(x2,y2)的图像 - - - void Rotate(int degree);//图像旋转的函数(简单起见,旋转角度为90度的整数倍) - - - void Mean_Variance(float &m, float &var);//求图像的均值和方差,利用参数输出 - - friend void Swap(Image &a, Image &b);//使用友元函数交换两个Image对象的数据 - void myFree(unsigned char** data, int h); - Image& operator=(Image& val);//重载操作符 - -private: - unsigned char **data; - int height; - int width; - BMPFILEHEADER bmpfileheader; - BITMAPINFOHEADER bitmapinfoheader; -}; - -#endif diff --git a/test/main.cpp b/test/main.cpp deleted file mode 100644 index 7dd6237..0000000 --- a/test/main.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "image.h" -#include -#include - -int main(int argc, char* argv[]) -{ - Image img; //创建对象 - //读写BMP文件 - img.ReadBMP("hello.bmp"); - img.WriteBMP("FruitsCopy.bmp"); - img.WriteText("FruitsCopy.text"); - - - //读写text文件 - Image readtxtImage; - readtxtImage.ReadText("FruitsCopy.text"); - readtxtImage.WriteText("writeFruits.text"); - - - //图像的上下翻转,并保存结果图像文件 - img.Flip(true); - //图像的左右翻转,如img.Flip(true);并保存结果图像文件 - img.Flip(false); - //左右翻转需要注意,每个像数占3个字节,翻转时不能简单直接翻转, - //而需要每个字节对应地翻转 - - - //图像的缩放,并保存结果图像文件 - img.Resize(false);//图像缩小 - img.Resize(true);//图像放大 - //缩小时也需要注意,每个像数占3个字节,不能简单通过删除字节而缩小, - //而需要每个字节对应地删除 - //放大也是一样的道理 - - - //获取图像的某点的像素值,并修改, 并保存结果图像文件 - int row = 100; - int col = 100; - img.At(row, col); - img.Set(row, col, 10); - img.Set(100); - - - //使用拷贝构造函数创建新的对象 - Image new_img(img); - new_img.WriteBMP("new_img.bmp"); - - - //截取指定区域内的图像,并保存结果图像文件(x1,y1) (x2,y2) - new_img.Cut(120,120,360,360); - //需要保证 x2 > x1 && y2 > y1 - - - //顺时针旋转图像并保存结果图像文件(简单起见,旋转角度为90度的整数倍) - img.Rotate(90); - img.Rotate(180); - img.Rotate(270); - - - //求图像的均值和方差,并在命令行输出 - float ave = 0; - float vAve = 0; - img.Mean_Variance(ave, vAve); - printf("平均值为:%f\n方差为:%f\n", ave, vAve); - - - //交换两个图像的数据 - Image img1("Baboon.bmp"); - Image img2("Lena.bmp"); - Swap(img1, img2); - //保存交换完的结果图像文件 - img1.WriteBMP("S_img1_baboon.bmp"); - img2.WriteBMP("S_img2_lena.bmp"); - return 0; -} diff --git a/test/struct.h b/test/struct.h deleted file mode 100644 index 10216cd..0000000 --- a/test/struct.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef STRUCT_H -#define STRUCT_H - -// 针对该结构体的字节对齐问题调整对齐策略 -#pragma pack(push,1) -struct BMPFILEHEADER -{ - unsigned short bfType; - unsigned int bfSize; - unsigned short bfReserved1; - unsigned short bfReserved2; - unsigned int bfOffBits; -}; -#pragma pack(pop) - -struct BITMAPINFOHEADER -{ - unsigned long biSize; //本结构所占用字节数 40字节 - long biWidth; //位图的宽度,以像素为单位 - long biHeight; //位图的高度,以像素为单位 - unsigned short biPlanes; //目标设备的级别,必须为1 - unsigned short biBitCount; //每个像素所需的位数,必须是1(双色)、 - //4(16色)、8(256色)或24(真彩色)之一 - unsigned long biCompression; //位图压缩类型,必须是 0(BI_RGB不压缩)、 - //1(BI_RLE8压缩类型) - //2(BI_RLE压缩类型)之一 - unsigned long biSizeImage; //位图的大小,以字节为单位 - long biXPelsPerMeter; //位图水平分辨率,每米像素数 - long biYPelsPerMeter; //位图垂直分辨率,每米像素数 - unsigned long biClrUsed; //位图实际使用的颜色表中的颜色数 - unsigned long biClrImportant; //位图显示过程中重要的颜色数 -}; - -#endif - diff --git a/transfer.exe b/transfer.exe index b04c17372b2f99933a66b58864226710c1ee8d34..9e99befc1a2ce795d4dc80328a9e507a174cba6f 100644 GIT binary patch delta 29 lcmZ4VfN9YKrU@O)F)#N|?Dl1zxSL_)Z510v!%enI#Q@GK41xdv delta 29 lcmZ4VfN9YKrU@O)i?;5Y*zL=FwUcq= old_width){y2 = y1;} if (x1 == x2 && y1 == y2){ uint32_t idx = x1*old_width+y1; - return old_pixels[x1][idx + 0], old_pixels[x1][idx + 1], old_pixels[x1][idx + 2];} + return old_pixels[idx + 0], old_pixels[idx + 1], old_pixels[idx + 2];} if (x1 == x2){ int x = x1; uint32_t idx1 = x*old_width+y; @@ -86,7 +86,7 @@ void bmpWrite(const char* name, const uch* raw_img, uint32_t width, uint32_t hei perror("Error bmpWrite."); return; } - // 妾旀璩囪▕ + // 濡炬梹顢嶇挬鍥枙 struct BmpFileHeader file_h = { .bfTybe=0x4d42, .bfReserved1=0, @@ -100,7 +100,7 @@ void bmpWrite(const char* name, const uch* raw_img, uint32_t width, uint32_t hei if(bits==8) {file_h.bfSize+= 1024, file_h.bfOffBits+= 1024;} - // 鍦栫墖璩囪▕ + // 閸︽牜澧栫挬鍥枙 struct BmpInfoHeader info_h = { .biSize=40, .biPlanes=1, @@ -112,10 +112,10 @@ void bmpWrite(const char* name, const uch* raw_img, uint32_t width, uint32_t hei }; info_h.biWidth = new_width; info_h.biHeight = new_height; - info_h.biBitCount = bits;// 澶氬皯浣嶇殑鍦 + info_h.biBitCount = bits;// 婢舵艾鐨担宥囨畱閸︼拷 info_h.biSizeImage = new_width*new_height * bits/8; if(bits == 8) {info_h.biClrUsed=256;} - // 瀵叆妾旈牠 + // 鐎殿偄鍙嗗鏃堢墵 FILE *pFile = NULL; // pFile = fopen(name,"wb+"); fopen_s(&pFile, name,"wb+"); @@ -125,7 +125,7 @@ void bmpWrite(const char* name, const uch* raw_img, uint32_t width, uint32_t hei } fwrite((char*)&file_h, sizeof(char), sizeof(file_h), pFile); fwrite((char*)&info_h, sizeof(char), sizeof(info_h), pFile); - // 瀵鑹茬洡 + // 鐎殿偉顎為懝鑼础 if(bits == 8) { for(unsigned i = 0; i < 256; ++i) { uch c = i; @@ -137,44 +137,50 @@ void bmpWrite(const char* name, const uch* raw_img, uint32_t width, uint32_t hei } // char newpixels[new_width*new_height]; - unsigned char **newpixels=(unsigned char**)malloc(new_width*new_height*3);// 娌掔敤鍒 + unsigned char **newpixels=(unsigned char**)malloc(new_width*new_height*3);// 濞屾帞鏁ら崚锟 - // 瀵叆鍦栫墖璩囪▕ + // 鐎殿偄鍙嗛崷鏍鐠╁洩鈻 size_t alig = ((new_width*bits/8)*3) % 4; - // for(int j = new_height-1; j >= 0; --j) { - // for(unsigned i = 0; i < new_width; ++i) { - // uint32_t idx = j*new_width +i; - // if(bits == 24) { // RGB鍦栫墖 - // fwrite((char*)&raw_img[idx*3 +2], sizeof(char), sizeof(uch), pFile); - // fwrite((char*)&raw_img[idx*3 +1], sizeof(char), sizeof(uch), pFile); - // fwrite((char*)&raw_img[idx*3 +0], sizeof(char), sizeof(uch), pFile); - // } else if(bits == 8) { // 鐏伴殠鍦 - // fwrite((char*)&raw_img[idx], sizeof(char), sizeof(uch), pFile); - // } - // } - - for(int j = new_height-1; j >= 0; --j) { for(unsigned i = 0; i < new_width; ++i) { uint32_t idx = j*new_width +i; - if(bits == 24) { // RGB鍦栫墖 - char** r, g, b = linear_insert(&(raw_img), j, i, width, height, radio_w, radio_h); - fwrite(b, sizeof(char), sizeof(uch), pFile); - fwrite(g, sizeof(char), sizeof(uch), pFile); - fwrite(r, sizeof(char), sizeof(uch), pFile); - } else if(bits == 8) { // 鐏伴殠鍦 + if(bits == 24) { // RGB閸︽牜澧 + fwrite((char*)&raw_img[idx*3 +2], sizeof(char), sizeof(uch), pFile); + fwrite((char*)&raw_img[idx*3 +1], sizeof(char), sizeof(uch), pFile); + fwrite((char*)&raw_img[idx*3 +0], sizeof(char), sizeof(uch), pFile); + // printf("%x",(raw_img)[idx*3 +2]); + // printf("%x",(raw_img)[idx*3 +1]); + // printf("%x",(raw_img)[idx*3 +0]); + // printf(" "); + } + else if(bits == 8) { // 閻忎即娈犻崷锟 fwrite((char*)&raw_img[idx], sizeof(char), sizeof(uch), pFile); } + // printf("\n"); } - //# 璁$畻鏂板儚绱 - // 灏嶉綂4byte + + + // for(int j = new_height-1; j >= 0; --j) { + // for(unsigned i = 0; i < new_width; ++i) { + // uint32_t idx = j*new_width +i; + // if(bits == 24) { // RGB閸︽牜澧 + // char** r, g, b = linear_insert(&(raw_img), j, i, width, height, radio_w, radio_h); + // fwrite(b, sizeof(char), sizeof(uch), pFile); + // fwrite(g, sizeof(char), sizeof(uch), pFile); + // fwrite(r, sizeof(char), sizeof(uch), pFile); + // } else if(bits == 8) { // 閻忎即娈犻崷锟 + // fwrite((char*)&raw_img[idx], sizeof(char), sizeof(uch), pFile); + // } + // } + //# 鐠侊紕鐣婚弬鏉垮剼缁憋拷 + // 鐏忓秹缍4byte for(size_t i = 0; i < alig; ++i) { fwrite("", sizeof(char), sizeof(uch), pFile); } } fclose(pFile); - free(newpixels); //瑷樺緱閲嬫斁绌洪枔 + free(newpixels); //鐟锋ê绶遍柌瀣杹缁屾椽鏋 } void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* height, uint16_t* bits) { @@ -182,11 +188,11 @@ void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* heigh perror("Error bmpRead."); return; } - // 妾旀璩囪▕ + // 濡炬梹顢嶇挬鍥枙 struct BmpFileHeader file_h; - // 鍦栫墖璩囪▕ + // 閸︽牜澧栫挬鍥枙 struct BmpInfoHeader info_h; - // 璁鍙栨獢闋 + // 鐠佲偓閸欐牗鐛㈤棆锟 FILE *pFile = NULL; // pFile = fopen(name, "rb+"); fopen_s(&pFile, name, "rb+"); @@ -196,25 +202,25 @@ void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* heigh } fread((char*)&file_h, sizeof(char), sizeof(file_h), pFile); fread((char*)&info_h, sizeof(char), sizeof(info_h), pFile); - // 璁鍙栭暦瀵 + // 鐠佲偓閸欐牠鏆︾碉拷 *width = info_h.biWidth; *height = info_h.biHeight; *bits = info_h.biBitCount; - **oldpixels=(unsigned char**)malloc((*width)*(*height)*3); + // **oldpixels=(unsigned char**)malloc((*width)*(*height)*3); - // size_t ImgSize = ((size_t)*width) * ((size_t)*height) * 3; - // *raw_img = (uch*)calloc(ImgSize, sizeof(uch)); - // 璁鍙栬畝鐗囪硣瑷婅綁RAW妾旇硣瑷 + size_t ImgSize = ((size_t)*width) * ((size_t)*height) * 3; + *oldpixels = (uch*)calloc(ImgSize, sizeof(uch)); + // 鐠佲偓閸欐牞鐣濋悧鍥。鐟峰﹨缍丷AW濡炬棁纭g懛锟 fseek(pFile, file_h.bfOffBits, SEEK_SET); size_t alig = ((info_h.biWidth*info_h.biBitCount/8)*3) % 4; for(int j = *height-1; j >= 0; --j) { for(unsigned i = 0; i < *width; ++i) { uint32_t idx = j*(*width)+i; - if(*bits == 24) { // RGB鍦栫墖 + if(*bits == 24) { // RGB閸︽牜澧 fread((char*)&(*oldpixels)[idx*3 +2], sizeof(char), sizeof(uch), pFile); fread((char*)&(*oldpixels)[idx*3 +1], sizeof(char), sizeof(uch), pFile); fread((char*)&(*oldpixels)[idx*3 +0], sizeof(char), sizeof(uch), pFile); - } else if(*bits == 8) { // 鐏伴殠鍦 + } else if(*bits == 8) { // 閻忎即娈犻崷锟 fread((char*)&(*oldpixels)[idx], sizeof(char), sizeof(uch), pFile); } } @@ -226,17 +232,17 @@ void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* heigh //--------------------------------------------------------------------------- // size_t ImgSize = ((size_t)*width) * ((size_t)*height) * 3; // *raw_img = (uch*)calloc(ImgSize, sizeof(uch)); - // // 璁鍙栬畝鐗囪硣瑷婅綁RAW妾旇硣瑷 + // // 鐠佲偓閸欐牞鐣濋悧鍥。鐟峰﹨缍丷AW濡炬棁纭g懛锟 // fseek(pFile, file_h.bfOffBits, SEEK_SET); // size_t alig = ((info_h.biWidth*info_h.biBitCount/8)*3) % 4; // for(int j = *height-1; j >= 0; --j) { // for(unsigned i = 0; i < *width; ++i) { // uint32_t idx = j*(*width)+i; - // if(*bits == 24) { // RGB鍦栫墖 + // if(*bits == 24) { // RGB閸︽牜澧 // fread((char*)&(*raw_img)[idx*3 +2], sizeof(char), sizeof(uch), pFile); // fread((char*)&(*raw_img)[idx*3 +1], sizeof(char), sizeof(uch), pFile); // fread((char*)&(*raw_img)[idx*3 +0], sizeof(char), sizeof(uch), pFile); - // } else if(*bits == 8) { // 鐏伴殠鍦 + // } else if(*bits == 8) { // 閻忎即娈犻崷锟 // fread((char*)&(*raw_img)[idx], sizeof(char), sizeof(uch), pFile); // } // } @@ -249,16 +255,17 @@ void bmpRead(const char* name, uch** oldpixels, uint32_t* width, uint32_t* heigh for(unsigned i = 0; i < *width; ++i) { uint32_t idx = j*(*width)+i; for(int k = 0; k < 3; k++){ - printf((char*)&(*oldpixels)[idx*3 + k]); - printf("\t"); + printf("%x",(*oldpixels)[idx*3 +k]); + printf(" "); } - printf("\t done \t"); + printf("\t"); } printf("\n"); } + printf("done \n"); } -// 鍦栧儚绲愭 +// 閸︽牕鍎氱徊鎰潗 typedef struct Imgraw { uint32_t width, height; uint16_t bits; @@ -281,11 +288,11 @@ int main(int argc, char const *argv[]) { printf("Enter a radio of height :") ; scanf("%f", &radio_h); printf("\n"); - // 寤烘 + // 瀵ょ儤顫 Imgraw img = {0, 0, 0, NULL}; - // 璁鍦 + // 鐠佲偓閸︼拷 Imgraw_Read(&img, "./input/bw2x1.bmp"); - // 瀵湒 + // 鐎殿偄婀 Imgraw_Writ(&img, "./output/bw2x1(output).bmp", radio_w, radio_h); return 0; } diff --git a/try.exe b/try.exe index 1d98d5d040a6a06af416c5ef6d615ff6006b9034..720aa167a87007b1a9ded6901899988a3a36cfd3 100644 GIT binary patch delta 8057 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