java 为透明图片添加背景颜色
需求介绍解决方式需求介绍
项目需要实现在线无纸化合同签署,调用触屏手写签名生成电子合同,在生成合同过程中需要调用OCR 技术对签署文字进行识别,在此过程中,生成的电子签图片背景必须是透明的(为了附着在合同上),但是OCR技术对透明图片上文字无法识别,因此在调用OCR前需要对图片进行处理,增加背景颜色,提高识别率。
解决方式
查阅资料发现许多同学使用 java Graphics2D 直接修改透明图片,但是直接修改的结果是添加了背景颜色,但是不是我们需要的背景颜色,参考地址:本文的解决方式是预先生成一个白色底片,将透明图片附在生成的白色图片上,达到添加背景的目的,具体代码如下:/*** 前端传递的参数为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图片操作异常");}}