Graphics2D ,Graphics 类,提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。

接到一个需求,需要后台生成一张图片,需要ui给出的多张图片合在一起,前端本来是画好的,但是因为小程序的问题,不能正常保存到相册,所以就由后台来画了,就和我介绍的一样,根据Graphics2D进行后台图片合成,绘制,我们一起来看一下吧。

基础方法:

颜色相关设置
public void setColor(int color)
public void setAlpha(int a)
public void setARGB(int a, int r, int g, int b)  public void setStyle(Style style)  设置填充样式
public void setStrokeWidth(float width)  设置画笔宽度
public void setAntiAlias(boolean aa)  抗锯齿功能
public void reset()   重置画笔文本相关设置
public void setTextSize(float textSize)  文本字体大小
public void setTextAlign(Align align)  文本对齐方式
public void setTextScaleX(float scaleX)  文本沿X轴水平缩放
public void setTextSkewX(float skewX)   设置文本倾斜程度
public void setUnderlineText(boolean underlineText)  下划线
public void setFakeBoldText(boolean fakeBoldText)  粗体设置
public void setStrikeThruText(boolean strikeThruText)  添加删除线

Paint方法:

setStrokeJoin 线条连接处样式
setStrokeMiter 线条连接处倾斜程度
setStrokeCap 线冒风格
setPathEffect 设置路径效果

我自己写的方法:

  /*** 首页分享合成图片* * @param userId* @param projectId* @return* @throws IOException*/public String overlapImageUrl(Long userId, Long projectId) throws IOException {String bosUrlIndex = "";try {int width = 598;int height = 852;// 背景图片String backgroundPath = "";String qeCodePath = "";// 获取二维码分享地址String appletXiaoMiDic = getAppletXiaoMiDic();// 二维码图片String qrCodePath = appletXiaoMiDic;// 设置图片大小BufferedImage background = resizeImage(599, 852, ImageIO.read(new URL(backgroundPath)));BufferedImage qrCode = resizeImage(142, 142, ImageIO.read(new URL(qrCodePath)));// 这里小女孩图片BufferedImage qeCode = resizeImage(228, 345, ImageIO.read(new URL(qeCodePath)));// 在背景图片中添加入需要写入的信息Graphics2D mainGrapics = background.createGraphics();// 消除文字和图片锯齿mainGrapics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);mainGrapics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 用户分享数据Map<String, Object> donateRecord = donateRecord(userId, projectId);// 文案1Graphics2D mainGrapics01 = background.createGraphics();// 消除文字锯齿mainGrapics01.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);String wenan = "********";String keshu = donateRecord.get("totalStock").toString() + "g";Font font = getDefinedFont(Font.PLAIN, 26);Font numberFont = font.deriveFont(26f);FontMetrics fm = mainGrapics.getFontMetrics(font);FontMetrics numberFfm = mainGrapics.getFontMetrics(numberFont);mainGrapics01.setColor(new Color(212, 99, 17));mainGrapics01.setFont(font);int stringWidth = numberFfm.stringWidth(keshu);int stringWidth2 = fm.stringWidth(wenan);mainGrapics01.drawString(wenan, width / 2 - stringWidth / 2 - stringWidth2 - 10 + 156, 225);mainGrapics01.setColor(new Color(130, 177, 95));mainGrapics01.setFont(numberFont);mainGrapics01.drawString(keshu, width / 2 - stringWidth / 2 + 150, 225);mainGrapics01.dispose();// 文案2Graphics2D mainGrapics02 = background.createGraphics();// 消除文字锯齿mainGrapics02.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);String wenan1 = "******";String cishu = donateRecord.get("donationCount").toString() + "次";Font font1 = getDefinedFont(Font.PLAIN, 26);Font numberFont1 = font1.deriveFont(26f);FontMetrics fm1 = mainGrapics.getFontMetrics(font1);FontMetrics numberFfm1 = mainGrapics.getFontMetrics(numberFont1);mainGrapics02.setColor(new Color(212, 99, 17));mainGrapics02.setFont(font1);int stringWidth1 = numberFfm1.stringWidth(cishu);int stringWidth21 = fm1.stringWidth(wenan1);mainGrapics02.drawString(wenan1, width / 2 - stringWidth1 / 2 - stringWidth21 - 10 + 173, 260);mainGrapics02.setColor(new Color(130, 177, 95));mainGrapics02.setFont(numberFont1);mainGrapics02.drawString(cishu, width / 2 - stringWidth1 / 2 + 170, 260);mainGrapics02.dispose();// 将上善若水,大爱无疆文案画到上下文上String message02 = "******";Graphics2D mainGrapics1 = background.createGraphics();// 消除文字锯齿mainGrapics1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);mainGrapics1.setFont(getDefinedFont(Font.BOLD, 34));mainGrapics1.setColor(new Color(212, 99, 17));mainGrapics1.drawString(message02, 134, 580);mainGrapics1.dispose();// // 感谢你文案String message03 = "*****";Graphics2D mainGrapics2 = background.createGraphics();// 消除文字锯齿mainGrapics2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);mainGrapics2.setColor(new Color(212, 99, 17));mainGrapics2.setFont(getDefinedFont(Font.BOLD, 36));mainGrapics2.drawString(message03, 238, 105);mainGrapics2.dispose();// // 用户名称Graphics2D mainGrapics4 = background.createGraphics();// 消除文字锯齿mainGrapics4.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);mainGrapics4.setColor(new Color(144, 80, 56));mainGrapics4.setFont(getDefinedFont(Font.BOLD, 22));mainGrapics4.drawString(donateRecord.get("name").toString(), 360, 100);mainGrapics4.dispose();Graphics2D g2 = background.createGraphics();// 画头像到上下文String photo = donateRecord.get("photo").toString();BufferedImage convertCircular = convertCircular(photo);// g2.drawImage(convertCircular, 151, 58, 68, 68, null);g2.drawImage(convertCircular.getScaledInstance(68, 68, Image.SCALE_AREA_AVERAGING), 151, 58, null);g2.setColor(Color.ORANGE);g2.dispose();// 文案2Graphics2D mainGrapics11 = background.createGraphics();// 消除文字锯齿mainGrapics11.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);String wenan2 = "**";String canyu = "****";String rens = donateRecord.get("number").toString() + "人";Font font2 = getDefinedFont(Font.PLAIN, 22);Font numberFont2 = font2.deriveFont(22f);FontMetrics fm2 = mainGrapics.getFontMetrics(font2);FontMetrics numberFfm2 = mainGrapics.getFontMetrics(numberFont2);mainGrapics11.setColor(new Color(198, 160, 130));mainGrapics11.setFont(font2);int stringWidth23 = numberFfm2.stringWidth(rens);int stringWidth22 = fm2.stringWidth(wenan2);mainGrapics11.drawString(wenan2, width / 2 - stringWidth23 / 2 - stringWidth22 - 30, 800);mainGrapics11.setColor(new Color(211, 99, 17));mainGrapics11.setFont(numberFont2);mainGrapics11.drawString(rens, width / 2 - stringWidth23 / 2 - 23, 800);mainGrapics11.setColor(new Color(198, 160, 130));mainGrapics11.setFont(font2);mainGrapics11.drawString(canyu, width / 2 + stringWidth23 / 2 - 19, 800);mainGrapics11.dispose();Graphics2D mainGrapics0 = background.createGraphics();// 添加小女孩图片mainGrapics0.drawImage(qeCode.getScaledInstance(345, 228, Image.SCALE_AREA_AVERAGING), 125, 300, null);// 在背景图片上添加二维码图片mainGrapics0.drawImage(qrCode.getScaledInstance(142, 145, Image.SCALE_AREA_AVERAGING), 232, 620, null);mainGrapics0.dispose();// 上传图片到bosByteArrayOutputStream output = new ByteArrayOutputStream();ImageIO.write(background, "jpg", output);String fileName = "XIAODUNONGZHUANG" + UUID.randomUUID() + ".jpg";bosService.putImageByBytes(output.toByteArray(), fileName, "jpg");bosUrlIndex = bosService.getDisplayBcsPath(fileName);// ImageIO.write(background, "jpg", new File(outPutPath));} catch (Exception e) {e.printStackTrace();}return bosUrlIndex;}

这是一张图片的绘制方法,值得注意的是你要涉及到用户头像的时候,推荐你一个方法,可以画圆头像

 /*** 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的** @param url 用户头像地址* @return* @throws IOException*/public static BufferedImage convertCircular(String url) throws IOException {BufferedImage bi1 = ImageIO.read(new URL(url));// 透明底的图片BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1.getHeight());Graphics2D g2 = bi2.createGraphics();g2.setClip(shape);g2.drawImage(bi1, 0, 0, null);g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.dispose();return bi2;}

基本用java绘制图片的方法就是这样,可以参考一下我的写法,这个东西不太难,多去看他的API文档,一点点扒出来

Graphics2D进行后台绘图相关推荐

  1. Java Graphics2D类的绘图方法

    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的 ...

  2. java的graphics2d_Java Graphics2D类的绘图方法

    Java Graphics2D类的绘图方法 Java语言在Graphics类提供绘制基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用强大的二维图形处理能力,提供.坐 ...

  3. java graphics2d 绘图_Java编程 Graphics2D类的绘图方法

    现在都讲究立体的效果,Graphics2D类的绘图方式就属于高级绘图了,在我们日常生活中经常提到的2d.3d电影都是立体的,而编程语言也是一样,可以实现2d的效果哦,下面就让我们一起来学习下吧! Ja ...

  4. java绘图- 绘图用法(基于Graphics2D)

    java绘图(基于Graphics2D) 1.绘图基本操作 请参考下面基础示例: 1 int width = 200, height = 250;2 //创建图片对象3 BufferedImage i ...

  5. java中椭圆类_Java中的Graphics2D类基本使用的教程

    Java中的Graphics2D类基本使用的教程 Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能 ...

  6. Java Graphics类的绘图方法

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段 ...

  7. Java绘图模式概述

    绘图模式是指后绘制的图形与早先绘制的图形有重叠时,如何确定重叠部分的颜色.例如,后绘制的覆盖早先绘制的:或者后绘制与早先绘制的两种颜色按某种规则混合.主要有正常模式和异或模式两种:正常模式是后绘制的图 ...

  8. Java绘图之设置字型和颜色

    Java绘图中,显示文字的方法主要有三种: (1)drawString(String str,int x,int y):在指定的位置显示字符串. (2)drawChars(char data[],in ...

  9. 如何使用Graphics2D在一张图片上画线(包括箭头)

    有这样一个需求,在一张图片上画几条线并保存,如图所示: 已知各个点的x,y坐标,坐标范围是[0.000,1],即将横纵方向分成1000份. 我们可以使用java.awt.Graphics2D的库来实现 ...

最新文章

  1. c语言定义字符类型变量的关键字,C语言数据类型
  2. IOS之通知NSNotificationCenter的使用
  3. Linux 查看内存状态
  4. Java关键字new和newInstance的区别
  5. SQL服务器引擎组件概览
  6. android edittext drawable,android – 在事件上显示复合drawable到EditText
  7. 基于matlab的数字水印技术研究,MATLAB在数字水印技术研究中的应用
  8. Android开机设置自启动
  9. javascript开发中的封装模式(转)
  10. java 接口 单元测试_java单元测试之如何实现异步接口的测试案例
  11. 关于RadASM使用编译资源脚本功能无法找到指定头文件的解决方案
  12. 百度网盘正版免费扩容教程
  13. xcode打包IPA(完整详细图文)
  14. 4┃音视频直播系统之浏览器中通过 WebRTC 进行桌面共享
  15. 基于Hbase和SpringBoot的分布式HOS文件存储系统
  16. Add Python Interpreter 报错 Error code:2. XX can‘t open file XX [Errno 2] No such file or directory
  17. 进制转换(任意进制转换)
  18. 东方证券首席架构师樊建:企业微服务架构转型实践
  19. 干货满满!25种绝佳VSCode扩展,体验便捷高效的生活
  20. Scrapy抓取豆瓣电影

热门文章

  1. 采购中心如何高效管理供应商的质量?
  2. 位深度怎么调_吉他大神是怎么炼成的?
  3. 卡牌游戏战斗系统的设计和实现二
  4. 风浪模拟数据准备步骤(MOW/SWAN):如何从ECMWF-EAR下载数据
  5. 使用思科模拟器设计和配置校园网络
  6. LeetCode刷题7--Nim游戏
  7. JavaScript 美化滑块
  8. 如何做好SEO优化排名
  9. 抖音seo搜索是什么?源码部署-seo排名系统源码分析
  10. Websocket无法连接