分类: Java开发

Java 动态生成图片基本接口整理

在开发中,经常需要动态生成图片,比如验证码、二维码等,包括前一段时间很流行的小孩举牌牌的图片,在这种情况下,图片只能在服务器内存中动态生成并返回给用户,然后在浏览器中显示出来。

在 Java 中,java.awt 包提供了基本的绘制图像的能力,我们可以在内存中绘制好需要的图形,然后编码成 jpeg 或其他图像格式,最后发送相应给浏览器。下面是整理的一些常用方法:

模板读取及画板生成

这种情况主要是基于底图绘制目标图的场景:

BufferedImage bi = ImageIO.read(new ByteArrayInputStream(pngBytes));
Graphics2D g = (Graphics2D) bi.getGraphics();

加载本地字体

例如绘制的图片需要黑体,然而服务器又不能让我们随便安装字段时可以如下处理:

Font base = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(ttfBytes));
g.setFont(base.deriveFont(26.0f)); // 字体大小 26 号

设置字体颜色

字体颜色的表达方式有很多种,此处主要是如何将 css 的颜色方式直接转换成 java 中的对象, 颜色查找可以查阅 RGB 颜色参考

g.setColor(Color.decode("0Xe8bc7f"));

文字居中

文字居中的问题主要是获取文字长度的问题,相关操作方式如下:

String s = "这是一个测试字符串!";
int width = g.getFontMetrics().stringWidth(s);
g.drawString(s, 375 - width / 2, 100);

图片缩放及图上画图

BufferedImage cover = xxxxxx;
RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_RENDERING,  RenderingHints.VALUE_RENDER_QUALITY);

g.setRenderingHints(hints);
g.drawImage(cover, 0, 0, newWidth, newHeight, 0, 0, cover.getWidth(), cover.getHeight(), null);

图片裁切

图片裁切主要基于 g.clip(Shape shap) 接口,多次调用可以多次裁切,裁切圆形可以:

Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, 100, 100);
g.clip(shape);

裁切矩形可以:

Rectangle2D.Double shap = new Rectangle2D.Double(0, 0, 100, 100);
g.clip(shape);

转回字节流

绘制完成后就可以结束操作返回浏览器了:

g.dispose();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(bi, "png", bos);

Recent Posts

Docker 容器非 root 用户监听 80 端口

起因是基于 CentOS 的 …

2 年 之前

基于 Docker 定时打印文件

先说背景,喷墨打印机有个很大的…

3 年 之前

Java 运行时反射获取来自继承的泛型

背景 正常情况下 Java 的…

3 年 之前

Java 基于 ByteBuddy 重写系统当前时间

背景 一般单元测试时总会有些代…

3 年 之前

华硕 B450F-Gaming 主板 I211-AT 网卡驱动安装

事情起因是买了块华硕的 ROG…

3 年 之前

PHP 安装 Memcached 扩展

登录服务器挨步执行: # su…

4 年 之前