17343001 艾鹤轩
Ex1:图像读取和显示以及像素操作
参考博客:https://blog.csdn.net/marvelgl/article/details/58596637
参考github:https://github.com/WangPerryWPY/Computer-Version
前言
输入图像:
#include "CImg.h"
using namespace cimg_library;
int main() {
CImg SrcImg;
SrcImg.load_bmp("1.bmp");
SrcImg.display("hw1");
return 0;
}
这里我们需要注意,我们要提前将所用的图片加入项目之中,同时使用老师给我们提供的CImg库。
void Display::change() {
//the color white to red.
//white(255,255,255)->red(255,0,0)
cimg_forXY(SrcImg, x, y) {
if (SrcImg(x, y, 0) == 255 && SrcImg(x, y, 1) == 255 && SrcImg(x, y, 2) == 255) {
SrcImg(x, y, 0) = 255;
SrcImg(x, y, 1) = 0;
SrcImg(x, y, 2) = 0;
}
}
//the color black to green
//black(0,0,0)->green(0,255,0)
//more color please search the RGB list.
cimg_forXY(SrcImg, x, y) {
if (SrcImg(x, y, 0) == 0 && SrcImg(x, y, 1) == 0 && SrcImg(x, y, 2) == 0) {
SrcImg(x, y, 0) = 0;
SrcImg(x, y, 1) = 255;
SrcImg(x, y, 2) = 0;
}
}
}
3. 在图上绘制一个等边三角形区域, 其中心坐标(50,50), 边长为 40,填充颜色为蓝色。
void Display::Draw_Triangle() {
cimg_forXY(SrcImg, x, y) {
if (y > 50-20*sqrt(3)/3 && y < 50+40*sqrt(3)/3){
if (x > (y + 110 * sqrt(3) / 3 - 50) / sqrt(3) && x < (y - 190 * sqrt(3) / 3 - 50) / (-1 * sqrt(3))) {
SrcImg(x, y, 0) = 0;
SrcImg(x, y, 1) = 0;
SrcImg(x, y, 2) = 255;
}
}
}
}
4. 在图上绘制一个圆形区域,圆心坐标(50,50),半径为 15,填充颜色为黄色。
void Display::DrawCircle_yellow1() {
cimg_forXY(SrcImg, x, y) {
if (pow(pow(x - 50, 2) + pow(y - 50, 2), 0.5) < 15) {
SrcImg(x, y, 0) = 200;
SrcImg(x, y, 1) = 155;
SrcImg(x, y, 2) = 0;
}
}
}
5. 在图上绘制一条长为 100 的直线段, 起点坐标为(0, 0), 方向角为 135 度, 直线的颜色为绿色。
void Display::DrawLine1() {
double x0 = 100 * cos(45 * PI / 180);
double y0 = 100 * sin(45 * PI / 180);
cimg_forXY(SrcImg, x, y) {
if (x == 0) {
if (y == 0) {
SrcImg(x, y, 0) = 0;
SrcImg(x, y, 1) = 255;
SrcImg(x, y, 2) = 0;
}
}
else {
if (cmp((double)y, (double)x*tan(45 * PI / 180)) && (double)x <= x0 && (double)y <= y0) {
SrcImg(x, y, 0) = 0;
SrcImg(x, y, 1) = 255;
SrcImg(x, y, 2) = 0;
}
}
}
}
6. 把上面的操作结果保存为 2.bmp。
main函数:使用temp.save.因为要保存2.bmp。所以这里有:
int main(int argc, char *argv[]) {
Display pic;
Display pic1;
CImg temp = pic.getSrcImg();
temp.save("1.bmp");
CImgtemp1 = pic1.getSrcImg();
temp.save("2.bmp");
return 0;
}
对于上面的第三、 四、五步, 先不用 CImg 的函数调用,绘制出相应的图形。然后再调用 CImg相关函数绘制出相应的图形。 并在实验文档中对比两者的差异。
第三步:三角形
未使用接口函数:
void Display::Draw_Triangle2() {
unsigned char blue[] = { 0,0,255 };
SrcImg.draw_circle(50, 50, 40, blue);
}
第四步:圆形
void Display::DrawCircle_yellow2() {
unsigned char yellow[] = { 200, 155, 0 };
SrcImg.draw_circle(50, 50, 15, yellow);
}
第五步:线
void Display::DrawLine2() {
unsigned char green[] = { 0,255,0 };
SrcImg.draw_line(0,0,100*cos(45*PI/180),100*sin(45*PI/180),green);
}
把上述功能代码写成类的形式,把上面的第三、 四、五步操作封装为该类的操作。
int main(int argc, char *argv[]) {
Display pic;
Display pic1;
pic.change();
pic.Draw_Triangle();
pic.DrawCircle_yellow1();
pic.DrawLine1();
pic.DrawLine2();
pic.Todisplay();
CImg temp = pic.getSrcImg();
temp.save("1.bmp");
pic1.change();
pic1.Draw_Triangle();
pic1.DrawCircle_yellow1();
pic1.DrawLine1();
pic1.DrawLine2();
pic1.Todisplay();
CImgtemp1 = pic1.getSrcImg();
temp.save("2.bmp");
return 0;
**思考: