1. /**
  2. * 图片绘制3d效果
  3. * @param srcImage
  4. * @param radius
  5. * @param border
  6. * @param padding
  7. * @return
  8. * @throws IOException
  9. */
  10. public static BufferedImage draw3D(BufferedImage srcImage, int radius, int border, int padding, Color bgColor) throws IOException{
  11. int width = srcImage.getWidth();
  12. int height = srcImage.getHeight();
  13. int size = (width + height ) / 2;
  14. Shape shape = new RoundRectangle2D.Float(0, 0, width, height, radius, radius);
  15.  
  16. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  17. Graphics2D g2d = image.createGraphics();
  18.  
  19. //绘制渐变背景
  20. if(bgColor == null){
  21. bgColor = Color.LIGHT_GRAY;
  22. }
  23. GradientPaint paint = new GradientPaint(0, 0, bgColor.darker(), 0, height, bgColor.brighter().brighter());
  24. g2d.setPaint(paint);
  25. g2d.setComposite(AlphaComposite.DstIn);
  26. g2d.fillRect(0, 0, width, height);
  27.  
  28. //绘图
  29. g2d.setComposite(AlphaComposite.Src);
  30. g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  31. g2d.fill(shape);
  32. g2d.setComposite(AlphaComposite.SrcAtop);
  33. g2d.drawImage(setClip(srcImage, radius), 0, 0, null);
  34.  
  35. //设置高亮效果
  36. g2d.setColor(new Color(255, 255, 255, 150));
  37. Shape highlightArea = createHighlightShape(0, 0, size, shape);
  38. g2d.fill(highlightArea);
  39.  
  40. //绘制边框
  41. if(border !=0){
  42. g2d.setColor(Color.LIGHT_GRAY);
  43. g2d.setStroke(new BasicStroke(border));
  44. g2d.drawRoundRect(border / 2, border/2, width- border, height- border, radius, radius);
  45. }
  46. g2d.dispose();
  47.  
  48. //加旁白
  49. if(padding > 0){
  50. int canvasWidth = width + padding * 2;
  51. int canvasHeight = height + padding * 2;
  52. BufferedImage newImage = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
  53. Graphics2D gd = newImage.createGraphics();
  54. float[] fractions = {0.0f, 0.6f};
  55. Color[] colors = {Color.LIGHT_GRAY, Color.WHITE};
  56. Point2D center = new Point2D.Float(canvasWidth / 2, canvasHeight /2);
  57. RadialGradientPaint paint2 = new RadialGradientPaint(center, size, fractions, colors);
  58. gd.setPaint(paint2);
  59. gd.setComposite(AlphaComposite.Src);
  60. gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  61. gd.fill(new RoundRectangle2D.Float(0, 0, canvasWidth, canvasHeight, radius, radius));
  62. gd.setComposite(AlphaComposite.SrcAtop);
  63. gd.drawImage(image, padding, padding, null);
  64. return newImage;
  65. }
  66. return image;
  67. }
  68.  
  69. /**
  70. * 图片设置圆角
  71. * @param srcImage
  72. * @return
  73. * @throws IOException
  74. */
  75. public static BufferedImage draw3D(BufferedImage srcImage) throws IOException{
  76. int radius = (srcImage.getWidth() + srcImage.getHeight()) / 6;
  77. return draw3D(srcImage, radius, 2, 5, null);
  78. }
  79.  
  80. /**
  81. * 图片切圆角
  82. * @param srcImage
  83. * @param radius
  84. * @return
  85. */
  86. public static BufferedImage setClip(BufferedImage srcImage, int radius){
  87. int width = srcImage.getWidth();
  88. int height = srcImage.getHeight();
  89. BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  90. Graphics2D g2d = image.createGraphics();
  91.  
  92. g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  93. g2d.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));
  94. g2d.drawImage(srcImage, 0, 0, null);
  95. g2d.dispose();
  96. return image;
  97. }
  98.  
  99. /**
  100. * 描边
  101. */
  102. public static BufferedImage setBorder(BufferedImage srcImage){
  103. int width = srcImage.getWidth();
  104. int height = srcImage.getHeight();
  105. int border = 1;
  106.  
  107. int nWidth = width + border * 2;
  108. int nHeight = height + border * 2;
  109.  
  110. BufferedImage image = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_INT_ARGB);
  111. Graphics2D g2d = image.createGraphics();
  112. int colorIncrement = 4;
  113. for(int i = border; i > 0; i--){
  114. int nw = width + 2 * i;
  115. int nh = height + 2 * i;
  116. BufferedImage tImage = new BufferedImage(nw, nh, BufferedImage.TYPE_INT_ARGB);
  117. Graphics2D tgs = tImage.createGraphics();
  118. tgs.drawImage(srcImage, 0, 0, nw, nh, null);
  119.  
  120. int red = 255 - colorIncrement * (border - i);
  121. int green = 255 - colorIncrement * (border - i);
  122. int blue = 255 - colorIncrement * (border - i);
  123. int rgb = new Color(red, green, blue).getRGB();
  124. System.out.println(rgb);
  125. for(int x = 0 ; x < nw; x++){
  126. for(int y = 0; y < nh; y++){
  127. if(tImage.getRGB(x, y)!=0){
  128. tImage.setRGB(x, y, rgb);
  129. }
  130. }
  131. }
  132.  
  133. tgs.dispose();
  134. g2d.drawImage(tImage, border - i, border -i, null);
  135. }
  136. g2d.drawImage(srcImage, border, border, null);
  137. g2d.dispose();
  138. return image;
  139. }
  140.  
  141. /**
  142. * 高亮层
  143. * @param centerX
  144. * @param centerY
  145. * @param size
  146. * @param body
  147. * @return
  148. */
  149. private static Shape createHighlightShape(int centerX, int centerY, int size, Shape body) {
  150. double myRadius = size * 4;
  151. double x = centerX - size * 2.3;
  152. double y = centerY - size * 3.2;
  153. Ellipse2D.Double circle = new Ellipse2D.Double(x, y, myRadius, myRadius);
  154. Area area = new Area(circle);
  155. area.intersect(new Area(body));
  156. return area;
  157. }

图片设置3D效果的更多相关文章

  1. 拜托,使用Three.js让二维图片具有3D效果超酷的好吗 💥

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 逛 sketchfab 网站的时候我看到有很多二维平面转 3D 的模型例子 ...

  2. 原生js实现图片的3d效果

    <!doctype html><html lang="en"><head><meta charset="UTF-8"& ...

  3. 3d效果的图片轮播

    CSS3的3d变换 CSS3给我们提供了一个新的功能,那就是3d变换.3d变换和2d变换的基本API函数类似,只不过多了些在Z轴上的操作,不难使用. 但是,为了让元素拥有3d变换的功能,我们需要给他的 ...

  4. wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

    原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依 ...

  5. WPF 图片浏览 伪3D效果

    原文:WPF 图片浏览 伪3D效果 首先上效果图: 因项目要求,需要把图片以"好看"."炫"的效果展示出来,特地研究了一下WPF关于3D方面的制作,奈何最终成果 ...

  6. jQuery旋转木马仿3D效果的图片切换特效代码

    用jQuery实现的一款仿3D效果的图片切换特效代码,类似旋转木马一样,幻灯图片以三维视觉上下滑动切换,效果很酷炫,兼容IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜 ...

  7. ios UIButton设置单选效果,以及同时设置图片和标题

    一,设置单选效果 - (void)selectedBtnPress:(UIButton*)sender { //首先把原来按钮的选中效果消除 for (int i=0;i<num;i++) {/ ...

  8. iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式

    一.启动图片设置了没有效果 解决方案:缓存啊!卸了程序重新安装吧!!!!! 二.单独创建xib需要注意的事项 三.图片取消系统渲染的快捷方式

  9. WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

    原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

随机推荐

  1. 监听tomcat服务器启动/关闭并从配置文件中读取参数进行初始化

    监听tomcat服务器启动/关闭很简单(2步): 1. 建立一个类实现ServletContextListener接口,重写其中的方法(contextDestroyed和contextInitiali ...

  2. 1.一个.java源文件中是否可以包括多个类?2...

    1.一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制? 答:可以有多个类,但只能有一个public类,并且public的类名必须与文件名相一致. 2.java有没有goto? 答 ...

  3. C#冒泡排序--详解

    思路:以数组int[]a={55,42,15,3,66,52};为例. 每一轮排序都把最大的数放在最后 所以, 对应循环语句思路 这样就很清晰了. 代码如下: , , , , , , , }; ; i ...

  4. Nvidia显卡怎样查看显存大小及硬件相关信息

    在电脑上安装Nvidia显卡驱动,平时也会通过Nvidia控制面板来查看显示显存位宽及宽带.显示显存容量和显示显存芯片信息等等,那么该如何查看Nvidia显存大小以及Nvidia硬件相关信息呢? 1. ...

  5. 自己动手开发编译器(五)miniSharp语言的词法分析器

    稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...

  6. 转:MFC网络编程学习

    要学习好网路编程,主要看以下几个方面: 1.掌握概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等. 2.在实际Windows网络通信软件开发中,异步非阻 ...

  7. IL2CPP的前世今生

    在2014年年中的时候,Unity3D官方博客上却发了一篇"The future of scripting in unity"的文章,引出了IL2CPP的概念,感觉有取代Mono之 ...

  8. 从汇编来看c语言之变量

    1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函 ...

  9. PHP之mysql笔记

    1:在php中提供了两个用于连接MySQL数据库服务器的函数. (1)int mysql_connect(hostname[:port][:/path/to/socket],user,pass). ( ...

  10. MFC之按键消息(长按处理)

    想要实现长按键的一些控制,查了查可以通过捕获键盘事件,然后处理按键时需要进行的操作.下面简单的实现左右按键界面更新数值加减.  1. 重载PreTranslateMessage(MSG* pMsg)函 ...