Java图片编辑合成:Graphics2D


theme: smartblue

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

写在前面

最近有一个需求,搞的人们有些头大;后来发现不是大家不会搞,完全就是不想搞,图片操作这种类似的需求基本上就是前端来处理。

现在丢给后端,自然是不太乐意。

但是没有办法,谁叫咱命苦呢。

这是一个什么样的需求?

话说,在开小程序端接口时,因为涉及到一些具体的元素信息页面。

所以通过微信来生成出一些特定二维码,专门来指向小程序中某个具体的元素信息详情页面。

但是微信API生成的二维码并没有任何标识信息。

于是这个需求就出现了,产品必须要每一个二维码下方带有元素名称的信息标识。

解决方案

如果解决这个问题,其实一开始是没什么思路的。

毕竟Java来处理图片的时代早已经过去了,近几年的Java语言早已经不流行处理这些了。

百度、google一番后,得到一个结果。

那就是Graphics2D,通过这个类可以增加一块类似幕布的底片,然后将原二维码图片放置到底片上。

随后在底片上的某个区域,我这里选择的是最下方来放置文字信息。

并且在这过程中设置了文字的左右居中。

可以参考一下代码,如果有人碰到这种情况了,可以自己根据要求修改。

java public static void main(String[] args) throws IOException { InputStream inputStream = new FileInputStream("D:/2.png"); BufferedImage bufferedImage = ImageIO.read(inputStream); BufferedImage image = new BufferedImage(310, 335, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = image.createGraphics(); graphics2D.fillRect(0, 0, 310, 335); graphics2D.drawImage(bufferedImage.getScaledInstance(280, 280, Image.SCALE_AREA_AVERAGING), 15, 15, 280, 280, null); Font font = new Font("黑体", Font.BOLD, 20); graphics2D.setFont(font); graphics2D.setColor(Color.BLACK); String text = "XJSDHG"; FontMetrics metrics = graphics2D.getFontMetrics(font); int startX = (310 - metrics.stringWidth(text)) / 2; graphics2D.drawString(text, startX, 320); ImageInputStream imageInputStream = ImageIO.createImageInputStream(image); ImageIO.write(image,"png",new FileOutputStream("D:/3.png")); }

还是要大概解读一下关键的几行代码。

graphics2D.fillRect(0, 0, 310, 335);

填充底片为白色,参数分别是起始横纵坐标、填充像素大小。

java FontMetrics metrics = graphics2D.getFontMetrics(font); int startX = (310 - metrics.stringWidth(text)) / 2; graphics2D.drawString(text, startX, 320);

居中处理,通过获取文字占用的像素大小来和原有像素做对比,得到起始坐标。

graphics2D.drawImage(bufferedImage.getScaledInstance(280, 280, Image.SCALE_AREA_AVERAGING), 15, 15, 280, 280, null);

填充图片,参数分别是图片对象、起始横纵坐标,覆盖像素长宽等。

总结

已经可以基本符合需求,当然这个也可以做一个比较好看的海报,将二维码放到指定的位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值