【笔记】C++ 简化位图图像操作
2012-02-13 20:08
281 查看
程序功能描述: 把每有个字符看成是二进制位数据,程序提供给这些字符组成的图像加边框操作、横向合并操作、纵向合并操作。
运行截图
代码来源于C++沉思录第九和第十章整理,为了通过gcc编译。修改了一点点内容,如有错误。望指正
#include <iostream> using namespace std; class Picture; ostream& operator<<(ostream&,const Picture&); Picture frame(const Picture&); Picture operator&(const Picture&,const Picture&); Picture operator|(const Picture&,const Picture&); class Picture { friend ostream& operator<<(ostream&,const Picture&); friend Picture frame(const Picture&); friend Picture operator&(const Picture&,const Picture&); friend Picture operator|(const Picture&,const Picture&); public: int height,width; Picture(); Picture(const string*,int); Picture(const Picture&); ~Picture(); Picture& operator=(const Picture&); char& position(int row,int col){ return data[row * width + col]; }///允许作为左值,可写 char position(int row,int col) const{ return data[row * width + col]; }////返回当前位置的值 private: char* data; void copyblock(int ,int ,const Picture&); void clear(int,int,int,int); void init(int ,int); static int max(int ,int); }; //当构建的图为空时,高度宽度为零,数据指针为空// Picture::Picture() : height(0),width(0),data(0){} //用于比较出字符数组中最常的长度,用以分配内存// int Picture::max(int m, int n) { return m>n?m:n; } //分配内存并且将指针赋给data同时也保存了长度和宽度// void Picture::init(int h, int w) { height = h; width = w; data = new char[height * width]; } //将array字符数组中的字符复制到Picture类对象的data中// Picture::Picture(const string* array, int n) { int w = 0; int i; for(i=0; i<n; i++) { w = Picture::max(w,array[i].length()); } init(n,w); for(i = 0; i<n; i++) { const string src = array[i]; int len = src.length(); int j = 0; while(j<len) { position(i,j) = src[j]; ++j; } while(j<width) { position(i,j) = ' '; ++j; } } } //将一个picture类的对象复制给另一个picture类的对象// Picture::Picture(const Picture& p):height(p.height),width(p.width),data(new char[p.height*p.width]) { copyblock(0,0,p); } //析构函数// Picture::~Picture(){delete []data;} //将一个图像(picture类)赋给另一个picture对象// Picture& Picture::operator =(const Picture& p) { if(this!=&p) { delete []data; init(p.height,p.width); copyblock(0,0,p); } return *this; } //从指定位置开始复制// void Picture::copyblock(int row, int col, const Picture& p) { for(int i=0;i<p.height; i++) for(int j=0; j<p.width; j++) position(i+row,j+col) = p.position(i,j); } //输出符重载// ostream& operator<<(ostream& o, const Picture& p) { for(int i=0;i<p.height;i++) { for(int j=0; j<p.width;j++) o<<p.position(i,j); o<<endl; } return o; } //给图像加上边框,p是源图像// Picture frame(const Picture& p) { Picture r; r.init(p.height+2, p.width+2); for(int i=1; i<r.height-1; i++) { r.position(i,0)='|'; r.position(i, r.width-1)='|'; } for(int j=1; j<r.width-1; ++j) { r.position(0,j) = '-'; r.position(r.height-1,j) = '-'; } r.position(0,0) = '+'; r.position(0,r.width -1) = '+'; r.position(r.height - 1,0) = '+'; r.position(r.height - 1,r.width-1) = '+'; r.copyblock(1,1,p); return r; } //清楚多余部分// void Picture::clear(int r1, int c1, int r2, int c2) { for(int r=r1;r<r2;++r) for(int c=c1;c<c2;++c) position(r,c) = ' '; } //纵向连接两幅图// Picture operator&(const Picture& p, const Picture& q) { Picture r; r.init(p.height+q.height,Picture::max(p.width,q.width)); r.clear(0, p.width,p.height,r.width); r.clear(p.height,q.width,r.height,r.width); r.copyblock(0,0,p); r.copyblock(p.height,0,q); return r; } //横向连接两幅图// Picture operator|(const Picture& p,const Picture& q) { Picture r; r.init(Picture::max(p.height, q.height),p.width+q.width); r.clear(p.height,0,r.height,p.width); r.clear(q.height,p.width,r.height,r.width); r.copyblock(0,0,p); r.copyblock(0,p.width,q); return r; } int main() { string init[]={"bystander","I live in","cnblogs"}; Picture p(init,3); cout<<p<<endl; Picture q = frame(p); cout<<q<<endl; Picture r = p | q; cout<<r<<endl; Picture s = q & r; cout<<s<<endl<<frame(s)<<endl; Picture e = frame(s) | frame(s); cout<<e<<endl; return 0; }
运行截图
代码来源于C++沉思录第九和第十章整理,为了通过gcc编译。修改了一点点内容,如有错误。望指正
相关文章推荐
- c++ 简化位图图像操作
- OpenCV(C++接口)学习笔记2-像素级的图像操作
- 《学习opencv》笔记——矩阵和图像操作——cvMax,cvMaxS,cvMerge,cvMin and cvMinS
- C/C++学习笔记2 - cin深入分析(上) - cin输入操作处理
- opencv3/C++图像像素操作
- c++学习笔记之文件操作
- opencv学习笔记(3) 锐化图像 邻域操作 ROI
- openCV学习笔记(四):图像遍历和像素操作
- 利用数组操作实现灰度图像放大两倍(C++&opencv)
- 图像识别-C++读取bmp位图入门
- WPF and Silverlight 学习笔记(二十七):基本图形的使用(2)Path和位图操作
- C++学习笔记之对文件的操作<1>
- OpenGL 编程指南笔记——第8章 OpenGL 绘制像素、位图、字体和图像
- 《OpenGL游戏程序设计》学习笔记---第七章图像、位图与OpenGL
- PKU C++程序设计实习 学习笔记5 文件操作和模板
- Matlab图像处理学习笔记(一):二值化、开操作、连通区域提取、重心、ROI
- C++代码笔记(1)string搜索操作——find()
- python学习笔记6—文件操作来生成船只侧面图像的描述文件
- C++操作Excel学习笔记(三)
- C++数据库操作学习笔记:ADO基础知识