您的位置:首页 > 编程语言 > C语言/C++

【笔记】C++ 简化位图图像操作

2012-02-13 20:08 281 查看
程序功能描述: 把每有个字符看成是二进制位数据,程序提供给这些字符组成的图像加边框操作、横向合并操作、纵向合并操作。

#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编译。修改了一点点内容,如有错误。望指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: