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);
填充图片,参数分别是图片对象、起始横纵坐标,覆盖像素长宽等。
总结
已经可以基本符合需求,当然这个也可以做一个比较好看的海报,将二维码放到指定的位置。