Java版颈椎自动矫正图


本来上周双休日没什么事情,准备干点遗留了很久的正经事,结果半途忍不住手贱看新闻,于是被11.28事件触动,随大流的针对棒子及棒子粉抽疯了两天。

没想到到星期一上班脖子就不得劲,顺便查了点资料,发现个山寨版的颈椎矫正图,觉得挺有意思。

如下图:



于是回家后想到自己也做个玩。

问题是,咱爷们不说程序员吧,好歹也是个垒码的,直接PS文字图未免有碍观瞻,于是抽空写了个Java自动生成版的。

代码如下:

  1. packageorg.test;

  2. importjava.awt.AlphaComposite;
  3. importjava.awt.Canvas;
  4. importjava.awt.Color;
  5. importjava.awt.Font;
  6. importjava.awt.Frame;
  7. importjava.awt.Graphics;
  8. importjava.awt.Graphics2D;
  9. importjava.awt.Image;
  10. importjava.awt.RenderingHints;
  11. importjava.awt.event.WindowAdapter;
  12. importjava.awt.event.WindowEvent;
  13. importjava.awt.image.BufferedImage;
  14. importjava.io.File;
  15. importjava.io.IOException;

  16. importjavax.imageio.ImageIO;

  17. /**
  18. *Copyright2008
  19. *
  20. *LicensedundertheApacheLicense,Version2.0(the"License");youmaynot
  21. *usethisfileexceptincompliancewiththeLicense.Youmayobtainacopyof
  22. *theLicenseat
  23. *
  24. *http://www.apache.org/licenses/LICENSE-2.0
  25. *
  26. *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
  27. *distributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUT
  28. *WARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.Seethe
  29. *Licenseforthespecificlanguagegoverningpermissionsandlimitationsunder
  30. *theLicense.
  31. *
  32. *@projectloonframework
  33. *@authorchenpeng
  34. *@email:ceponline@yahoo.com.cn
  35. *@version0.1
  36. */
  37. publicclassMessageImageextendsCanvas{

  38. /**
  39. *
  40. */
  41. privatestaticfinallongserialVersionUID=1L;

  42. privateBufferedImagefontImage;

  43. privateGraphics2Dg2d;
  44. privateImagebackImage;
  45. finalstaticprivateintWIDTH=600;

  46. finalstaticprivateintHEIGHT=480;


  47. publicMessageImage(finalStringmessages){

  48. fontImage=newBufferedImage(WIDTH,HEIGHT,2);
  49. g2d=fontImage.createGraphics();
  50. try{
  51. backImage=ImageIO.read(newFile("back.png"));
  52. }catch(IOExceptione){
  53. e.printStackTrace();
  54. }
  55. g2d.drawImage(backImage,0,0,null);
  56. setAlpha(g2d,0.7);
  57. intsize=25;
  58. intnewLine=(WIDTH/size)-10;
  59. char[]messageChars=messages.toCharArray();
  60. booleand=true;
  61. StringBuildersbr=newStringBuilder();
  62. intcount=0;
  63. intlen=messageChars.length-1;
  64. StringfontStyle="幼圆";
  65. Colorcolor=Color.white;
  66. for(inti=0,j=0;i<=len;i++,j++){
  67. sbr.append(messageChars[i]);
  68. if(j==newLine||(messageChars[i]=='\n')){
  69. g2d.drawImage(createImageMessages(1,false,sbr.toString(),
  70. color,fontStyle,1,size,d),count+=30,
  71. (HEIGHT-(sbr.length()*size))-(size*4),null);
  72. d=!d;
  73. sbr.delete(0,sbr.length());
  74. j=0;
  75. }elseif(i==len){
  76. g2d.drawImage(createImageMessages(1,false,sbr.toString(),
  77. color,fontStyle,1,size,d),count+=30,
  78. (HEIGHT-(sbr.length()*size))-(size*4),null);
  79. }
  80. }
  81. setAlpha(g2d,0.6);
  82. Stringmes="Java版颈椎自动矫正图";
  83. fontStyle="华文新魏";
  84. size=20;
  85. g2d.drawImage(createImageMessages(0,true,mes,Color.red,fontStyle,
  86. 1,size,false),WIDTH-(mes.length()*size)-(size*2),
  87. HEIGHT-(size*2),null);
  88. }

  89. /**
  90. *创建一组图片文字
  91. *
  92. *@paramaspect
  93. *@paramisRow
  94. *@parammessages
  95. *@paramcolor
  96. *@paramname
  97. *@paramstyle
  98. *@paramsize
  99. *@paramd
  100. *@return
  101. */
  102. publicstaticBufferedImagecreateImageMessages(finalintaspect,
  103. finalbooleanisRow,finalStringmessages,finalColorcolor,
  104. finalStringname,finalintstyle,finalintsize,finalbooleand){
  105. finalintflength=messages.length();
  106. finalintnowSize=size*flength;
  107. BufferedImagefontImages;
  108. if(isRow)
  109. fontImages=newBufferedImage(nowSize,size,2);
  110. else
  111. fontImages=newBufferedImage(size,nowSize,2);
  112. Graphics2Dgraphics2d=fontImages.createGraphics();
  113. char[]messageChars=messages.toCharArray();
  114. if(d){
  115. char[]temp=newchar[flength];
  116. for(inti=0,j=flength-1;i<flength;i++,j--){
  117. temp[j]=messageChars[i];
  118. }
  119. messageChars=temp;
  120. }
  121. if(isRow)
  122. for(inti=0;i<flength;i++){
  123. graphics2d.drawImage(createImageMessage(aspect,
  124. messageChars[i],color,name,style,size,d),
  125. i*size,0,null);
  126. }
  127. else
  128. for(inti=0;i<flength;i++){
  129. graphics2d.drawImage(createImageMessage(aspect,
  130. messageChars[i],color,name,style,size,d),0,i
  131. *size,null);
  132. }
  133. graphics2d.dispose();
  134. System.gc();
  135. returnfontImages;
  136. }

  137. /**
  138. *创建单独图片文字
  139. *
  140. *@paramaspect
  141. *@parammessage
  142. *@paramcolor
  143. *@paramname
  144. *@paramstyle
  145. *@paramsize
  146. *@paramd
  147. *@return
  148. */
  149. publicstaticBufferedImagecreateImageMessage(finalintaspect,
  150. finalcharmessage,finalColorcolor,finalStringname,
  151. finalintstyle,finalintsize,finalbooleand){
  152. finalintnowSize=size+1;
  153. BufferedImagefontImage=newBufferedImage(nowSize,nowSize,2);
  154. Graphics2Dgraphics2d=fontImage.createGraphics();
  155. graphics2d.setColor(color);
  156. graphics2d.setFont(newFont(name,style,size));
  157. //设定图像显示状态
  158. RenderingHintshints=newRenderingHints(
  159. RenderingHints.KEY_TEXT_ANTIALIASING,
  160. RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
  161. hints.put(RenderingHints.KEY_DITHERING,
  162. RenderingHints.VALUE_DITHER_ENABLE);
  163. hints.put(RenderingHints.KEY_RENDERING,
  164. RenderingHints.VALUE_RENDER_SPEED);
  165. hints.put(RenderingHints.KEY_ANTIALIASING,
  166. RenderingHints.VALUE_ANTIALIAS_ON);
  167. hints.put(RenderingHints.KEY_FRACTIONALMETRICS,
  168. RenderingHints.VALUE_FRACTIONALMETRICS_ON);
  169. hints.put(RenderingHints.KEY_COLOR_RENDERING,
  170. RenderingHints.VALUE_COLOR_RENDER_QUALITY);
  171. hints.put(RenderingHints.KEY_DITHERING,
  172. RenderingHints.VALUE_DITHER_DISABLE);
  173. graphics2d.setRenderingHints(hints);
  174. graphics2d.drawString(String.valueOf(message),0,size-3);
  175. graphics2d.dispose();
  176. switch(aspect){
  177. case0:
  178. break;
  179. case1:
  180. fontImage=MessageImage.rotateImage(fontImage,90,d);
  181. break;
  182. case2:
  183. fontImage=MessageImage.rotateImage(fontImage,180,d);
  184. break;
  185. case3:
  186. fontImage=MessageImage.rotateImage(fontImage,360,d);
  187. break;
  188. }
  189. returnfontImage;
  190. }

  191. publicvoidpaint(Graphicsg){
  192. g.drawImage(fontImage,0,0,null);
  193. }

  194. /**
  195. *水平翻转当前图像
  196. *
  197. *@return
  198. */
  199. publicstaticBufferedImagerotateImage(finalBufferedImageimage){
  200. intw=image.getWidth();
  201. inth=image.getHeight();
  202. BufferedImageimg;
  203. Graphics2Dgraphics2d;
  204. (graphics2d=(img=newBufferedImage(w,h,image.getColorModel()
  205. .getTransparency())).createGraphics()).drawImage(image,0,0,
  206. w,h,w,0,0,h,null);
  207. graphics2d.dispose();
  208. returnimg;
  209. }

  210. /**
  211. *旋转图像为指定角度
  212. *
  213. *@paramdegree
  214. *@return
  215. */
  216. publicstaticBufferedImagerotateImage(finalBufferedImageimage,
  217. finalintangdeg,finalbooleand){
  218. intw=image.getWidth();
  219. inth=image.getHeight();
  220. inttype=image.getColorModel().getTransparency();
  221. BufferedImageimg;
  222. Graphics2Dgraphics2d;
  223. (graphics2d=(img=newBufferedImage(w,h,type)).createGraphics())
  224. .setRenderingHint(RenderingHints.KEY_INTERPOLATION,
  225. RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  226. graphics2d.rotate(d?-Math.toRadians(angdeg):Math.toRadians(angdeg),
  227. w/2,h/2);
  228. graphics2d.drawImage(image,0,0,null);
  229. graphics2d.dispose();
  230. returnimg;
  231. }

  232. finalstaticpublicvoidsetAlpha(finalGraphics2Dg,finaldoubled){
  233. AlphaCompositealphacomposite=AlphaComposite
  234. .getInstance(3,(float)d);
  235. g.setComposite(alphacomposite);
  236. }

  237. publicstaticvoidmain(String[]args){
  238. java.awt.EventQueue.invokeLater(newRunnable(){
  239. publicvoidrun(){
  240. Frameframe=newFrame();
  241. frame.addWindowListener(newWindowAdapter(){
  242. publicvoidwindowClosing(WindowEvente){
  243. System.exit(0);
  244. }
  245. });
  246. frame
  247. .add(newMessageImage(
  248. "每天面对计算机\n不是垒码、就是泡论坛、再不然就是和脑残作斗争,爆个哈韩吧,攻击个棒子网什么的,再闲时就写写Blog,转转Google,"
  249. +"总之24小时离不开电脑,离不开网络(已被纳入我国精神病症状|||),长时间不活动,这颈椎可怎么受的了?没办法,想点办法解决吧。"
  250. +"最近有人说图片能治疗颈椎病,我却偏不信那个邪,就几句话能费人多大的力气去看?说到底还真能累死活人不成?"
  251. +"这左转右绕上窜下跳的,除了费点眼睛,怎么可能把脖子一块运动起来?您说是不是这道理?"));
  252. frame.setSize(WIDTH+5,HEIGHT+25);
  253. frame.setResizable(false);
  254. frame.setTitle("Java版颈椎自动矫正图");
  255. frame.setLocationRelativeTo(null);
  256. frame.setVisible(true);
  257. }
  258. });
  259. }

  260. }



效果图如下:



仔细说起来,这就和各大小说门户生成图片版小说的原理一般无二,毫无技术难度可言,不过毕竟写了,也就丢出来在Blog凑个数。

那位有时间的话(或者等以后鄙人闲的没事),可以做个自动导出,弄套资治通鉴全文之类的图片做颈椎矫正,试验下连续的看完整本颈椎是轻松了,还是碎掉了……




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值