java 为透明图片添加背景颜色

java 为透明图片添加背景颜色

  • 需求介绍
    • 解决方式

需求介绍

项目需要实现在线无纸化合同签署,调用触屏手写签名生成电子合同,在生成合同过程中需要调用OCR 技术对签署文字进行识别,在此过程中,生成的电子签图片背景必须是透明的(为了附着在合同上),但是OCR技术对透明图片上文字无法识别,因此在调用OCR前需要对图片进行处理,增加背景颜色,提高识别率。

解决方式

  1. 查阅资料发现许多同学使用 java Graphics2D 直接修改透明图片,但是直接修改的结果是添加了背景颜色,但是不是我们需要的背景颜色,参考地址:
  2. 本文的解决方式是预先生成一个白色底片,将透明图片附在生成的白色图片上,达到添加背景的目的,具体代码如下:
	/**
     * 前端传递的参数为base64编码的字符串
     * @param picStr
     * @return
     */
public void str2Image(String picStr) {
        byte[] decode = Base64Utils.decode(picStr);
        InputStream in = new ByteArrayInputStream(decode);
        BufferedImage srcImage;
        try {
            srcImage = ImageIO.read(in);
            changeImageBackground(srcImage);
        } catch (IOException e) {
            log.error("ocr 将str转化io异常:", e);
            throw new ServiceException("图片添加背景色异常");
        }
    }

    public void changeImageBackground(BufferedImage srcImage) {
        BufferedImage outImage = null;
        try {
            int oldHeight = srcImage.getHeight();
            int oldWidth = srcImage.getWidth();

            int destWidth = oldWidth * 2;

            int destHeight = oldHeight * 2;
            outImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = (Graphics2D) outImage.getGraphics();
            // 设置背景颜色
            graphics2D.setBackground(Color.WHITE);
            graphics2D.clearRect(0, 0, destWidth, destHeight);

            // 设置图片居中显示
            graphics2D.drawImage(srcImage, (destWidth - oldWidth) / 2, (destHeight - oldHeight) / 2, null);
            graphics2D.dispose();
            ByteArrayOutputStream os = new ByteArrayOutputStream();

            ImageIO.write(outImage, ConstantUtil.FileType.PNG, os);
            byte[] bytes = os.toByteArray();

            String string = Base64Utils.encodeToString(bytes);
            //  log.info(string);
            // 调用ocr服务
            // sendOcr(string);
        } catch (IOException e) {
            log.error("对ocr图片操作异常", e);
            throw new ServiceException("对ocr图片操作异常");
        }
    }

你可能感兴趣的:(博客)