Java彩色图片转16进制黑白数据和红白数据

Java图片添加文字,图片添加图片

将最终的图片数据,按照每个像素的RGB转换成16进制黑白数据和红白数据

  1. 首先读取图片
/**读取图片
     * 
     * @param imagePath 图片路径
     * @return
     */
public static BufferedImage readImage(String imagePath) {
    try {
        InputStream inputStream = ImageUtil.class.getClassLoader().getResourceAsStream(imagePath);
        //            File imageFile = new File(imagePath);
        BufferedImage originalImage = ImageIO.read(inputStream);

        // 创建一个用于绘制文字的新图片副本,确保不会直接修改原始图片
        BufferedImage modifiedImage = new BufferedImage(
            originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics graphics = modifiedImage.getGraphics();

        // 复制原始图片到新图片
        graphics.drawImage(originalImage, 0, 0, null);

        return originalImage;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
  1. 添加文字到图片
/**
     * 添加文字到图片
     * @param originalImage 背景图片的buffered数据
     * @param textToAdd 文字内容
     * @param x 位置x
     * @param y 位置y
     * @param textColor 文字颜色
     * @param textSize  文字大小
     * @param rightStatus   是否靠右对齐
     * @return
     */
public static BufferedImage addTextToImage(BufferedImage originalImage, String textToAdd, int x, int y, Color textColor, int textSize, boolean rightStatus) {

    BufferedImage modifiedImage = new BufferedImage(
        originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics graphics = modifiedImage.getGraphics();
    // 复制原始图片到新图片
    graphics.drawImage(originalImage, 0, 0, null);
    try {
        // 设置文字的颜色和字体
        //            Color textColor = Color.RED;
        Font font = new Font("黑体", Font.PLAIN, textSize);
        graphics.setColor(textColor);
        graphics.setFont(font);

        //是否右对齐
        if (rightStatus) {
            FontMetrics fontMetrics = graphics.getFontMetrics(font);
            int textWidth = fontMetrics.stringWidth(textToAdd);

            // 计算绘制文字的起始点
            x = x - textWidth;
        }
        graphics.drawString(textToAdd, x, y);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return modifiedImage;
}
  1. 添加图片
/**
     * 添加图片
     * @param backgroundImage 背景图片的buffered数据
     * @param imageToAdd 添加图片的buffered数据
     * @param x 位置x
     * @param y 位置y
     * @return
     */
public static BufferedImage addImageToImage(BufferedImage backgroundImage, BufferedImage imageToAdd, int x, int y) {
    // 创建一个用于绘制的新图片副本,确保不会直接修改原始图片
    BufferedImage modifiedImage = new BufferedImage(
        backgroundImage.getWidth(), backgroundImage.getHeight(), BufferedImage.TYPE_INT_RGB);

    // 将背景图片绘制到新图片
    Graphics graphics = modifiedImage.createGraphics();
    graphics.drawImage(backgroundImage, 0, 0, null);
    // 添加图片到图片
    graphics.drawImage(imageToAdd, x, y, null);

    graphics.dispose();
    //        System.out.println("图片生成成功");
    return modifiedImage;
}
  1. 循环读取图片每个像素的RGB并进行转换
/**
     *
     * @param bufferedImage 背景图片的buffered数据
     */
public static void RGBToHex(BufferedImage bufferedImage) {
    String hexBlack = "";
    String hexRed = "";
    int i = 0;
    byte b = 0x00; // 10000000
    byte r = 0x00;
    for (int y = 0; y < bufferedImage.getHeight(); y++) {
        for (int x = 0; x < bufferedImage.getWidth(); x++) {
            int rgb = bufferedImage.getRGB(x, y);
            int col = grayscale(rgb);
            if (col == 1) {
                b = (byte) (b | (1 << (7 - i)));
            }
            if (col == 2) {
                r = (byte) (r | (1 << (7 - i)));
            }
            i++;
            if (i == 8) {
                hexBlack += HexConvertUtil.BinaryToHexString(new byte[]{b}, false);
                hexRed += HexConvertUtil.BinaryToHexString(new byte[]{r}, false);
                i = 0;
                b = 0x00; // 10000000
                r = 0x00;
            }
        }
    }


    //        makeImage(bufferedImage, "F:\\image\\office\\" + roomId + ".jpg");
}


/**
     * 
     * @param rgb rgb数据
     * @return
     */
public static int grayscale(int rgb) {
    Color color = new Color(rgb);
    int red = color.getRed();
    int green = color.getGreen();
    int blue = color.getBlue();
    int grayscale = (red + green + blue) / 3;

    int result = 0;


    if (grayscale < 128) {
        result = 1;
    }
    if (red > 240 && green < 30 && blue < 30) {
        result = 2;
    }

    return result;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值