网络图片转base64

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


项目中常把网络图片下载转base64,记录自己用过的2种方式


例1

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>




public static String factoryBase(String imgPath) {
    try {
        URL url = new URL(imgPath);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5 * 1000);
        InputStream inStream = conn.getInputStream();
        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();
        byte[] data = outStream.toByteArray();
        BASE64Encoder encoder = new BASE64Encoder();
        String base64 = encoder.encode(data);
        return base64;
    } catch (Exception e) {
        return "";
    }
}

例2

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.8</version>
        <exclusions>
           <exclusion>
                <artifactId>commons-codec</artifactId>
                <groupId>commons-codec</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5.8</version>
    </dependency>



/**
 * 获取图片的Get请求
 * @param url
 * @param headers
 * @param queryMap
 * @param socketTimeOut
 * @param connectTimeOut
 */
 public static String base64GetRequest(String url,
                                   Map<String, String> headers,
                                   Map<String, String> queryMap,
                                   int socketTimeOut,
                                   int connectTimeOut) {
        HttpGet httpGet = null;
        CloseableHttpClient client = null;

        //拼接查询参数
        String param = setParam(queryMap);
        if (param != null && param.trim() != "") {
            url = url + "?" + param;
        }
        try {
            System.out.println("请求地址:" + url);
            httpGet = getHttpGet(url, headers, socketTimeOut, connectTimeOut);
            //获取重试client
            client = getRetryCloseableHttpClient();
            HttpResponse resp = client.execute(httpGet);
            HttpEntity entity = resp.getEntity();
            int responseCode = resp.getStatusLine().getStatusCode();
            System.out.println("responseCode=" + responseCode);
            if (responseCode != 200) {
                String str = EntityUtils.toString(entity, "UTF-8").trim();
                System.out.println();
            }
            InputStream inStream = entity.getContent();


            //--------------------------------转base64---------------------------
            //转base64
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while ((len = inStream.read(buffer)) != -1) {
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            //关闭输入流
            inStream.close();
            byte[] data = outStream.toByteArray();
            //对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            String base64 = encoder.encode(data);

//            -----------base64写到文件------------
//            File file = new File("D:\\image\\filename.txt");
//            if (!file.exists()) {
//                file.createNewFile();
//            }
//            FileWriter fw = new FileWriter(file.getAbsoluteFile());
//            BufferedWriter bw = new BufferedWriter(fw);
//            bw.write(base64);
//            bw.close();
            return base64;

        } catch (ConnectTimeoutException e) {
            System.out.println("连接超时异常");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (httpGet != null) {
                httpGet.abort();
            }
            try {
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                System.out.println("调用第三方服务出错");
            }
        }
        return null;
    }

    private static String setParam (Map<String, String> queryMap) {
        String param = "";
        try {
            if (queryMap != null && !queryMap.isEmpty()) {
                StringBuilder queryBuilder = new StringBuilder();
                Iterator iterator = queryMap.entrySet().iterator();

                while (iterator.hasNext()) {
                    Map.Entry<String, Object> queryEntry = (Map.Entry) iterator.next();
                    Object object = queryEntry.getValue();
                    if (object instanceof JSONArray) {
                        JSONArray jsonArray = (JSONArray) object;
                        for (int i = 0; i < jsonArray.size(); i++) {
                            Object value = jsonArray.get(i);
                            value = URLEncoder.encode(String.valueOf(value), "UTF-8");
                            queryBuilder.append(queryEntry.getKey()).append("=").append(value).append("&");
                        }
                    } else {
                        Object value = queryEntry.getValue();
                        value = URLEncoder.encode(String.valueOf(value), "UTF-8");
                        queryBuilder.append(queryEntry.getKey()).append("=").append(value).append("&");
                    }
                }

                param = queryBuilder.toString().substring(0, queryBuilder.toString().length() - 1);
            }
        } catch (Exception e) {
            String msg = "参数encode失败";
            System.out.println("参数encode失败" + e);
        }
        return param;
    }

    private static HttpGet getHttpGet(String url, Map<String, String> headers, int socketTimeOut, int connectTimeOut) {
        //拼接查询参数
        HttpGet httpGet = new HttpGet(url);
        //填充header
        if (headers != null && !headers.isEmpty()) {
            Iterator iterator = headers.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, Object> queryEntry = (Map.Entry) iterator.next();
                httpGet.setHeader(queryEntry.getKey(), String.valueOf(queryEntry.getValue()));
            }
        }

        RequestConfig requestConfig = RequestConfig.custom().
                setSocketTimeout(socketTimeOut).setConnectTimeout(connectTimeOut).setCookieSpec(CookieSpecs.STANDARD).build();//设置请求和传输超时时间
        httpGet.setConfig(requestConfig);
        return httpGet;
    }

    public static CloseableHttpClient getRetryCloseableHttpClient() {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setRetryHandler(new HttpRequestRetryHandler() {
            public boolean retryRequest(IOException ioException, int retryTimes, HttpContext httpContext) {
                HttpClientContext clientContext = HttpClientContext.adapt(httpContext);
                HttpRequest request = clientContext.getRequest();

                System.out.println("handleGetRequestWithBodyParam 请求重试次数:" + retryTimes + ",request:" + request);
                if (retryTimes > 2) {
                    return false;
                }
                if (!(ioException instanceof SSLException)) {
                    return true;
                }

                boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
                if (idempotent) {
                    // 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的
                    return true;
                }
                return false;
            }
        });
        CloseableHttpClient client = httpClientBuilder.build();
        return client;
    }

生成的base64文件经常很大可以压缩处理下

    public static String base64Image(String url) {
        if (url.indexOf("http") > -1) {
            String base64 = "base64的字符串";
            if (base64 != "") {
                return resizeImageTo40K(base64);
            }
        }
        return "";
    }



    public static BufferedImage base64String2BufferedImage(String base64string) {
        BufferedImage image = null;
        try {
            InputStream stream = BaseToInputStream(base64string);
            image = ImageIO.read(stream);
        } catch (IOException e) {
        }
        return image;
    }
//    BufferedImage转换成base64,在这里需要设置图片格式,如下是jpg格式图片:

    public static String imageToBase64(BufferedImage bufferedImage) {
        Base64 encoder = new Base64();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(bufferedImage, "jpg", baos);
        } catch (IOException e) {
        }
        return new String(encoder.encode((baos.toByteArray())));
    }

    private static InputStream BaseToInputStream(String base64string) {
        ByteArrayInputStream stream = null;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] bytes1 = decoder.decodeBuffer(base64string);
            stream = new ByteArrayInputStream(bytes1);
        } catch (Exception e) {
            // TODO: handle exception
        }
        return stream;
    }

    /**
     * base64压缩
     * @param base64Img
     * @return
     */
    public static String resizeImageTo40K(String base64Img) {
        try {
            BufferedImage src = base64String2BufferedImage(base64Img);
            BufferedImage output = Thumbnails.of(src).size(src.getWidth() / 3, src.getHeight() / 3).asBufferedImage();
            String base64 = imageToBase64(output);
            if (base64.length() - base64.length() / 8 * 2 > 40000) {
                output = Thumbnails.of(output).scale(1 / (base64.length() / 40000)).asBufferedImage();
                base64 = imageToBase64(output);
            }
            return base64;
        } catch (Exception e) {
            return base64Img;
        }
    }

此处参见原文:https://www.jianshu.com/p/50e4560940e5


总结

不积跬步,无以至千里.不积小流,无以成江海

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值