1. 将字节数组保存为图片
public static void byte2Image(byte[] data, String path) {
try (FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path))) {
imageOutput.write(data, 0, data.length);
} catch (IOException e) {
e.printStackTrace();
}
}
2. 图片剪切
public static byte[] cropImage(byte[] imageByte, int x, int y, int width, int height) throws IOException {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageByte);
BufferedImage image = ImageIO.read(byteArrayInputStream);
BufferedImage subImage = image.getSubimage(x, y, width, height);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(subImage, "jpg", byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
3. 图片上写字
public String genBadgeImage(String filePath, String str) throws IOException {
String suffix = StringUtils.substringAfterLast(filePath, ".");
BufferedImage image = ImageIO.read(new File(filePath));
Graphics2D graphics = image.createGraphics();
// String[] availableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); //获取所有可用的字体名称
Font font = new Font("Roboto", Font.BOLD, FONT_SIZE);//字体不存在会使用默认的,不会报错
FontMetrics metrics = graphics.getFontMetrics(font);
graphics.setFont(font); //指定字体
graphics.setColor(Color.WHITE); //设置字体颜色
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); //抗锯齿
graphics.drawString(str, X, Y + metrics.getAscent() - metrics.getDescent());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, suffix, byteArrayOutputStream); // 对于带有透明色域(Alpha channel)的图片(背景透明那些),得用png,否则生成的图片颜色不对
return uploadAndResize(byteArrayOutputStream.toByteArray(), str + "." + suffix);
}