主要是工作中用到要将客户上传的身份证正反面照片从数据库中取出来(格式为base64字符串,竟然是将图片保存在数据库里面的),合成成为一张图片,然后再转码为base64,调用第三方接口把合成图片的base64传过去。(后面就不知道他们拿去干什么了)

  • 图片合成

参考: 使用Java合并图片 ,写了一个图片合成的例子,可以优化的地方还有很多。仅供参考。
图片尺寸缩放(压缩),网上很多都是使用老版本的 JPEGImageEncoder类的方法,这个方法是sun公司私有方法,IDE没有设置的话可能找不到这个类。现在采用的是ImageIO类的方法,可以正常输出图片。

import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;

import javax.imageio.ImageIO;

public class CompositePhotograph{    /**     * @描述: 合成图片     * @param face 身份证正面     * @param back 身份证反面     * @param fileName 合成图片文件名     * @return     * @throws IOException     */    public static File compositePhoto(File face , File back ,String fileName) throws IOException{        BufferedImage b1 = ImageIO.read(face);        BufferedImage b2 = ImageIO.read(back);        //根据两张图片得到合成图片的宽高        int width = b1.getWidth()<b2.getWidth() ? b1.getWidth() : b2.getWidth();        int height = b1.getHeight() + b2.getHeight();        //合成的图片        BufferedImage cp = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);        Graphics g = cp.getGraphics();        g.drawImage(b1,0,0,null);//上部分        g.drawImage(b2,0,b1.getHeight(),null);//下部分        //检查文件        File f = new File(fileName);        if(f.exists()){            f.delete();            f.createNewFile();        }else{            f.createNewFile();        }        //输出图片        ImageIO.write(cp, "jpg", f);        return f;    }

    /**     * @描述: 改变图片尺寸,按给出的width,等比例缩放高     * @param bi 需要改变的图片     * @param fileName 生成的新图片的文件名     * @param width 修改的宽     * @return     * @throws IOException      */    public static File resize(File source,String fileName,int width) throws IOException{        Image img = ImageIO.read(source);//原图片文件        int srcW = img.getWidth(null);        int srcH = img.getHeight(null);        double x = (double)width/(double)srcW;//缩放比例        int height = (int) (srcH * x);//缩放后的高        //新图片        BufferedImage newImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);        //缩放后的图片        Image tag = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);        newImg.getGraphics().drawImage(tag, 0, 0, null);//绘制到画板上        File f = new File(fileName);        if(f.exists()){            f.delete();            f.createNewFile();        }else{            f.createNewFile();        }        /* 输出到文件流  ,网上很多都是这种写法,这是已经过时了的写法,现在都使用ImageIO.write()来输出压缩后的文件了        FileOutputStream out = new FileOutputStream(f);          JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);          encoder.encode(tag);          out.flush();          out.close();        */        //写入文件        ImageIO.write(newImg, "jpg", f);        return f;    }}
  • base64编码转换

在读取BufferedInputStream输入流的内容的时候,使用了这个byte[] bytes = new byte[bis.available()];bis.read(bytes);一次性将文件内容全部读取出来。之前试过使用while( (count=bis.read(bytes)) != -1 ){ strBuilder.append(bytes); }来分步读取,但是读取出来的结果不对,也没有去探究原因//TODO 待查吧。

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;

import org.apache.commons.codec.DecoderException;import org.apache.commons.codec.binary.Base64;

public class DENcode{    //读写尺寸    private final static int SIZE = 1024*10;

    /**     * @描述: 将文件编码为base64格式     * @param f 要编码的文件     * @return     * @throws IOException     */    public String encode(File f) throws IOException{        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));//将文件转换成流        byte[] bytes = new byte[bis.available()];//记录二进制数组,大小为bis读取不阻塞长度        bis.read(bytes);//一次性全部读取        bis.close();        Base64 b = new Base64();        byte[] encodeFile = b.encode(bytes);//编码        return new String(encodeFile);    }

    /**     * @描述: 将base64解码为图片文件     * @param base64Str base64编码字符串     * @param fileName 转换成的图片文件名     * @return     * @throws DecoderException     * @throws IOException     */    public File decode(String base64Str,String fileName) throws DecoderException, IOException{        //使用apache的编解码类        Base64 b = new Base64();        byte[] by = b.decode(base64Str);        //调整异常数据         for(int i=0;i<by.length;++i){              if(by[i]<0){                 by[i]+=256;              }        }        File df = new File(fileName);        //删除旧文件,防止写入时有垃圾数据        if(df.exists()){            df.delete();        }else{            df.createNewFile();        }        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(df),SIZE);        bos.write(by);        bos.flush();        bos.close();        return df;    }

}
  • 一个小demo,实现前面的业务逻辑
import java.io.File;import java.io.IOException;

import org.apache.commons.codec.DecoderException;

import composite_photograph.CompositePhotograph;import ende_code.DENcode;

public class Photograph{    public static void main(String[] args) throws DecoderException, IOException    {        System.out.println("开始");        String fan = "base64字符串1";        String zheng = "base64字符串2";        DENcode denCode = new DENcode();        File fanF = denCode.decode(fan, "resources/fan.jpg");        File zhengF = denCode.decode(zheng, "resources/zheng.jpg");        File reFanF = CompositePhotograph.resize(fanF, "resources/reFan.jpg", 500);        File reZhengF = CompositePhotograph.resize(zhengF, "resources/reZheng.jpg", 500);        File cpF = CompositePhotograph.compositePhoto(reZhengF, reFanF,"resources/cp.jpg");        String cpStr = denCode.encode(cpF);        System.out.println("完成");    }}

Java图片合成、base64转换相关推荐

  1. 时间戳转换、BASE64和MD5加解密、秒表、图片进行BASE64转换离线使用小工具

    PortableTools使用说明文档 工具下载地址:PortableTools 一.时间戳转换 1.日期转换为时间戳 2.时间戳转换为日期 二.BASE64和MD5加解密 1.BASE64输入原文, ...

  2. java 图片合成到A4纸上

    最近2天在做移动端的项目,需要安卓 ios将拍完照的身份证正面和反面以Base64字符串传递给我,我拿到2个图片的地址,将这2张图片通过后台java技术合成到一张A4纸上之后以图片格式给移动端一个UR ...

  3. Java图片合成并引入外部字体写入文字

    业务需要将两个图片合成,并按指定字体写入标语以及用户的经纬度,代码如下: import cn.hutool.core.img.GraphicsUtil;import javax.imageio.Ima ...

  4. php把buffer转化为图片_php base64转换成图片的方法

    php base64转换成图片的方法:首先获取到前端传递的值:然后设置文件路径和命名文件名称:接着将数据流文件写入创建的文件内容中:最后将路径信息返回给前端使用即可. 将base64数据流文件转换为图 ...

  5. java图片转base64注意事项

    java转base64有两点需要注意的地方,在window操作系统中,图片转换为base64,在base64的字符串中会有默认换行,这就破坏了json格式,所以这里需要做一下处理.除此之外,在java ...

  6. java 对图片格式处理,Java 图片处理 格式转换

    Java 图片处理(包括 Jmagick 的应用) 图片处理( 的应用) 作者: 佚名, 出处:IT 专家网, 2010-10-29 08:30 责任编辑: 谢妍妍, 近期有使用到图片的压缩处理,由于 ...

  7. ajax请求去获取base64_前端将图片转换为base64位,使用ajax传递到后台,但是图片经过base64转换成字符串后非常长,无法使用ajax...

    展开全部 前端生成的代码最终格式如下: data:image/png;base64,xxxxxxxxxx........... 后端这样解码 base64=base64.Replace("d ...

  8. JAVA 图片地址路径转换 Base64 工具类

    工具类代码: import sun.misc.BASE64Encoder; import java.io.ByteArrayOutputStream; import java.io.FileInput ...

  9. java 图片合成 工具类_Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】...

    本文实例讲述了Java实现的微信图片处理工具类.分享给大家供大家参考,具体如下: 现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到 想要的给予的期望: ...

最新文章

  1. 【.Net MF网络开发板研究-04】Socket编程之服务端
  2. 超 40W 奖金池等你来战!第二届“长沙银行杯”腾讯云启创新大赛火热来袭!...
  3. Linux CentOS各大网站镜像资源地址展示,各种rpm资源包下载地址,rpm安装包大全
  4. 机器学习中的训练与损失 test and loss (训练loss不下降原因集合)
  5. 周江华:网易云信IM推送保障及网络优化实践
  6. 汽车故障检测软件_检测认证事业部软件测评公司党支部与汽车测评管理中心党支部开展党建共建活动...
  7. 基于 pureXML 技术的数据库表结构扩展
  8. python爬取新浪博客_python爬虫-韩寒新浪博客博文
  9. 五色电阻在线计算机,色环电阻(5色环在线电阻计算器)
  10. Matlab中struct2cell函数使用
  11. 数据分析3_淘宝用户行为分析_阿里云天池
  12. 算法竞赛入门经典第11章 无根树转有根树
  13. 彻底解决win10出现的无法访问网络位置*:\XXXXX\XXXXX的问题
  14. 客户机是计算机网络硬件吗,计算机网络中硬件连接设备有哪些?
  15. DEVC++第五人格V2.0
  16. Java/Android 进程与线程之 多线程开发(二)
  17. stm32—超声波传感器
  18. 从零开始学C语言 : 初阶指针
  19. Allegro如何导入第三方网表操作指导
  20. 2-3判断奇偶数(PTA)

热门文章

  1. C++ 动态分配内存的好处
  2. 无皇刀谭 #183; 异邦人
  3. java 传绝对路径无效_痛心!侯耀文弟子突发肺栓塞在医院抢救无效身亡,年仅36岁...
  4. extmail mysql数据库 重启_基于POSTFIX的邮件服务器维护总结。
  5. fifa 18 android.com,FIFA18
  6. mac查看端口占用程序
  7. vscode关闭C/C++红色波浪线
  8. 梯度消失和梯度爆炸问题及其解决方法详解
  9. json schema多种形式_JsonSchema使用详解
  10. git 查看当前分支是基于那个分支拉出来的