原创

java 绘图常用知识点总结

1、指定字体

  • 将指定的字体库放置到项目的资源文件夹下
  • 以文件流的方式加载文件
  • 缓存字体,避免重复加载。
// 获取指定的字体
private static java.awt.Font getSelfDefinedFont(String fontName) {
    InputStream inputStream=This.class.getResourceAsStream(MessageFormat.format("/font/{0}.TTF",fontName)); 
    java.awt.Font font = null;
    try {
        if (map.containsKey(fontName)) {
            return map.get(fontName);
        }
        font = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, inputStream);
        map.put(fontName, font);
    } catch (Exception e) {
        log.error("font load failed {}", e.getMessage());
        return null;
    }
    return font;
}
font.deriveFont(java.awt.Font.PLAIN, fontSize);
设置字号

2、获取指定文本的宽高

用指定的字体、字号、文本生成图片

 // 获取font的样式应用在str上的整个矩形
Rectangle2D r =
        font.getStringBounds(
                content,
                new FontRenderContext(
                        AffineTransform.getScaleInstance(1, 1), false, false));
// 获取单个字符的高度
int unitHeight = (int) Math.floor(r.getHeight());
// 获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度
int width = (int) Math.round(r.getWidth()) + 1;
// 把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度
int height = unitHeight + 3;
// 创建图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
// 先用白色填充整张图片,也就是背景
g.fillRect(0, 0, width, height);
// 在换成黑色
g.setColor(Color.black);
// 设置画笔字体
g.setFont(font);
// 画出字符串
g.drawString(content, 0, font.getSize());
g.dispose();

// 返回数据流
ByteArrayOutputStream out = new ByteArrayOutputStream();
image = imageTransparencyhandle(image);
ImageIO.write(image, "png", out);
byte[] b = out.toByteArray();

3、图片透明化处理

private BufferedImage imageTransparencyhandle(BufferedImage image) {
// 高度和宽度
int height = image.getHeight();
int width = image.getWidth();

// 生产背景透明和内容透明的图片
ImageIcon imageIcon = new ImageIcon(image);
BufferedImage bufferedImage =
        new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics(); // 获取画笔
g2D.drawImage(imageIcon.getImage(), 0, 0, null); // 绘制Image的图片

int alpha = 0; // 图片透明度
// 外层遍历是Y轴的像素
for (int y = bufferedImage.getMinY(); y < bufferedImage.getHeight(); y++) {
    // 内层遍历是X轴的像素
    for (int x = bufferedImage.getMinX(); x < bufferedImage.getWidth(); x++) {
        int rgb = bufferedImage.getRGB(x, y);
        // 对当前颜色判断是否在指定区间内
        if (colorInRange(rgb)) {
            alpha = 0;
        } else {
            // 设置为不透明
            alpha = 255;
        }
        // #AARRGGBB 最前两位为透明度
        rgb = (alpha << 24) | (rgb & 0x00ffffff);
        bufferedImage.setRGB(x, y, rgb);
    }
}
return bufferedImage;
}
// 判断是背景还是内容
public static boolean colorInRange(int color) {
int red = (color & 0xff0000) >> 16; // 获取color(RGB)中R位
int green = (color & 0x00ff00) >> 8; // 获取color(RGB)中G位
int blue = (color & 0x0000ff); // 获取color(RGB)中B位
// 通过RGB三分量来判断当前颜色是否在指定的颜色区间内
if (red >= color_range && green >= color_range && blue >= color_range) {
    return true;
}
;
return false;
}

// 色差范围0~255
public static int color_range = 210;
正文到此结束
本文目录