Java 图片处理汇总

java 中的图片处理,都是得到图片的byte[],得到图片的byte[] ,就可以对这个图片进行随意操作了。

在前端传过来的图片主要是3种

1.传图片的base64 字符串,这个需要我们将这个字符串转为byte[]


if(imageStr.contains("image/jpeg")){
	imageStr = imageStr.replaceAll("data:image/jpeg;base64,", "");
}else if(imageStr.contains("image/png")){
	imageStr = imageStr.replaceAll("data:image/png;base64,", "");
}
Decoder decoder = Base64.getDecoder();
byte[] bytes = decoder.decode(imageStr);


2.传图片的file .(通过二进制的形式传到后台)这个时候,后台可以通过request的参数得到这个MutipartFile;
也可以通过@MultipartFile file直接接收到该对象。 其实质也是得到图片的byte[]


MultipartHttpServletRequest req =(MultipartHttpServletRequest)request;
MultipartFile multipartFile =  req.getFile("image");

再取出MultipartFile 的byte[]

if (multipartFile != null) {
    // 上传到oss
    byte[] content = new byte[0];
    try {
         content = multipartFile.getBytes();
                    
    } catch (IOException e) {
         log.error("e:{}",e);
    }
}

3.传图片的网络url,通过http的方式得到一个图片的InputStream 再转为byte[]


    /**
     * 得到文件流
     *
     * @param url
     * @return
     */
    public static byte[] getFileStream(String url) {
        try {
            URL httpUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
            byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 从输入流中获取数据
     *
     * @param inStream 输入流
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }

得到图片的byte[] ,就可以对这个图片进行随意操作了。
比如存储到本地路径,对文件进行压缩等。

存储到本地路径

String tempPath = "/opt/pic/temp.jpg";
try(OutputStream out=new FileOutputStream(tempPath);){
// content 是图片的byte[]
out.write(content);
out.flush();
}

对图片进行压缩:压缩到指定长宽,压缩到指定大小

    /**
     * 将图像压缩成指定大小
     * @param content
     * @param height
     * @param width
     * @throws Exception
     **/

    public byte[] cutImage(byte[] content,int height, int width ) {
        ByteArrayInputStream intputStream = new ByteArrayInputStream(content);
        ByteArrayOutputStream outputStream =new ByteArrayOutputStream(BYTE_BUFFER_SIZE);
        try {
            Thumbnails.of(intputStream).size(width, height).keepAspectRatio(false).toOutputStream(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        byte[] byteArray=outputStream.toByteArray();
        return byteArray;
    }

    /**
     * 根据指定大小压缩图片
     *
     * @param imageBytes  源图片字节数组
     * @param desFileSize 指定图片大小,单位kb
     * @return 压缩质量后的图片字节数组
     */
    public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
        if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
            return imageBytes;
        }
        long srcSize = imageBytes.length;
        double accuracy = getAccuracy(srcSize / 1024);
        try {
            while (imageBytes.length > desFileSize * 1024) {
                ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
                Thumbnails.of(inputStream)
                        .scale(accuracy)                // 传一个double类型的数字,缩放比例,大于1就是变大,小于1就是缩小
                        .outputQuality(accuracy)        // 控制图片质量
                        .toOutputStream(outputStream);
                imageBytes = outputStream.toByteArray();
            }
        } catch (Exception e) {
            log.error("compressPicForScale e:{}",e);
        }
        return imageBytes;
    }

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值