图像模拟类第一次实现 c++沉思录 第九章

本文介绍了一个名为Picture的类,该类用于处理图像并提供多种图像操作功能,如图像的拼接、叠加等。通过示例展示了如何使用此类进行基本的图像处理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. /*
  2. *=====================================================================================
  3. *
  4. *Filename:Picture1.cpp
  5. *
  6. *Description:图像处理,第一次实现
  7. *
  8. *Version:1.0
  9. *Created:2009年01月08日12时56分35秒
  10. *Revision:none
  11. *Compiler:gcc
  12. *
  13. *Author:LiWeiJian(mn),lwj1396@163.com
  14. *Company:hunanuniversity
  15. *
  16. *=====================================================================================
  17. */
  18. #include<iostream>
  19. usingnamespacestd;
  20. classPicture
  21. {
  22. friendostream&operator<<(ostream&,constPicture&);
  23. friendPictureframe(constPicture&);
  24. friendPictureoperator&(constPicture&,constPicture&);
  25. friendPictureoperator|(constPicture&,constPicture&);
  26. public:
  27. Picture();
  28. Picture(constchar*const*,int);
  29. Picture(constPicture&);
  30. ~Picture();
  31. Picture&operator=(constPicture&);
  32. intHeight()const{returnthis->height;}
  33. intWidth()const{returnthis->width;}
  34. private:
  35. intheight,width;
  36. char*data;
  37. voidcopyblock(int,int,constPicture&);
  38. voidclear(int,int,int,int);
  39. char&position(introw,intcol){returndata[row*width+col];}
  40. charposition(introw,intcol)const{returndata[row*width+col];}
  41. voidinit(inth,intw){height=h;width=w;data=newchar[height*width];}
  42. staticintmax(intn,intm){returnm>n?m:n;}
  43. };
  44. Picture::
  45. Picture():height(0),width(0),data(0)
  46. {}
  47. Picture::
  48. Picture(constchar*const*array,intn)//n为列数
  49. {
  50. intw=0;
  51. for(inti=0;i<n;i++)
  52. w=max(w,strlen(array[i]));
  53. init(n,w);
  54. for(inti=0;i<n;i++)
  55. {
  56. constchar*src=array[i];
  57. intlen=strlen(src);
  58. intj=0;
  59. while(j<len)
  60. {
  61. position(i,j)=src[j];
  62. j++;
  63. }
  64. while(j<width)
  65. {
  66. position(i,j)='';
  67. j++;
  68. }
  69. }
  70. }
  71. Picture::
  72. Picture(constPicture&p):
  73. height(p.Height()),width(p.Width()),data(newchar[p.Height()*p.Width()])
  74. {
  75. copyblock(0,0,p);
  76. }
  77. Picture&
  78. Picture::operator=(constPicture&p)
  79. {
  80. if(this!=&p)//IMPORTANT
  81. {
  82. delete[]data;
  83. init(p.Height(),p.Width());
  84. copyblock(0,0,p);
  85. }
  86. return*this;
  87. }
  88. Picture::
  89. ~Picture()
  90. {
  91. delete[]data;
  92. }
  93. voidPicture::
  94. copyblock(introw,intcol,constPicture&p)
  95. {
  96. inth=p.Height();
  97. intw=p.Width();
  98. for(inti=0;i<h;i++)
  99. for(intj=0;j<w;j++)
  100. position(i+row,j+col)=p.position(i,j);
  101. }
  102. voidPicture::
  103. clear(intr1,intc1,intr2,intc2)
  104. {
  105. for(intr=r1;r<r2;++r)
  106. for(intc=c1;c<c2;c++)
  107. position(r,c)='';
  108. }
  109. ostream&operator<<(ostream&o,constPicture&p)
  110. {
  111. inth=p.Height();
  112. intw=p.Width();
  113. for(inti=0;i<h;i++)
  114. {
  115. for(intj=0;j<w;j++)
  116. o<<p.position(i,j);
  117. o<<endl;
  118. }
  119. returno;
  120. }
  121. Pictureframe(constPicture&p)
  122. {
  123. Picturer;
  124. r.init(p.Height()+2,p.Width()+2);
  125. for(inti=1;i<r.height-1;++i)
  126. {
  127. r.position(i,0)='|';
  128. r.position(i,r.width-1)='|';
  129. }
  130. for(intj=1;j<r.width-1;++j)
  131. {
  132. r.position(0,j)='-';
  133. r.position(r.height-1,j)='-';
  134. }
  135. r.position(0,0)='+';
  136. r.position(0,r.width-1)='+';
  137. r.position(r.height-1,0)='+';
  138. r.position(r.height-1,r.width-1)='+';
  139. r.copyblock(1,1,p);
  140. returnr;
  141. }
  142. Pictureoperator&(constPicture&p,constPicture&q)
  143. {
  144. Picturer;
  145. r.init(p.height+q.height,max(p.width,q.width));
  146. r.clear(0,p.width,p.height,r.width);
  147. r.clear(p.height,q.width,r.height,r.width);
  148. r.copyblock(0,0,p);
  149. r.copyblock(p.height,0,q);
  150. returnr;
  151. }
  152. Pictureoperator|(constPicture&p,constPicture&q)
  153. {
  154. Picturer;
  155. r.init(max(p.height,q.height),p.width+q.width);
  156. r.clear(p.height,0,r.height,q.height);
  157. r.clear(q.height,p.width,r.height,r.width);
  158. r.copyblock(0,0,p);
  159. r.copyblock(0,p.width,q);
  160. returnr;
  161. }
  162. intmain()
  163. {
  164. char*init[]={"Paris","inthe","Spring"};
  165. Picturep(init,3);
  166. //cout<<p<<endl;
  167. Pictureq=frame(p);
  168. cout<<frame(q|(p&q))<<endl;
  169. //cout<<q<<endl;
  170. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值