图像读取和显示以及像素操作
要求
- 读取 1.bmp 文件,并用 CImg.display() 显示
代码
#include "CImg/CImg.h"
using namespace cimg_library;
void showbmp()
{
CImg<unsigned char> image;
image.load_bmp("1.bmp");
image.display();
}
int main() {
showbmp();
return 0;
}
解释:
编译需要加参数 -O2 -lgdi32 表示优化第二级别 -lgdi32是windows的一个动态库(暂时不知道作用)
- 把 1.bmp 文件的白色区域变成红色,黑色区域变成绿色
代码
void changeColor() {
CImg<unsigned char> img("t.bmp");
cimg_forXY(img, x, y) {
if(img(x,y,0) == 255 && img(x,y,1) == 255 && img(x,y,2) == 255) {
img(x,y,0) = 255;
img(x,y,1) = 0;
img(x,y,2) = 0;
}
else if(img(x,y,0) == 0 && img(x,y,1) == 0 && img(x,y,2) == 0) {
img(x,y,0) = 0;
img(x,y,1) = 255;
img(x,y,2) = 0;
}
}
img.display("2");
}
解释:
这里使用cimg_forXY方法,是c++的宏用法。 这个宏定义如下:
- 在图上绘制一个圆形区域,圆心坐标(50,50),半径为 30,填充颜色为蓝色。
- 在图上绘制一个圆形区域,圆心坐标(50,50),半径为 3,填充颜色为黄色。
代码
void yuan3() {
CImg<unsigned char> img("t.bmp");
cimg_forXY(img, x, y) {
double x2 = pow(x-50, 2);
double y2 = pow(y-50, 2);
double distance = sqrt(x2+y2);
// 只需要改变这里的代码就可以完成3或者4
if(distance <= 30.0) {
img(x, y, 0) = 0;
img(x, y, 1) = 0;
img(x, y, 2) = 255;
}
}
img.display("3");
}
思考:
- 为什么第四步绘制的圆形区域形状效果不好
半径太小,图像的像素不高,在这个半径中的像素点少所以颗粒感明显,边缘难以平滑。