【问题标题】:Encode image from URL in Base64 in JavaJava中Base64中URL中的图像编码
【发布时间】:2014-06-25 20:13:17
【问题描述】:

我想在 Base64 中编码和保存 URL 图像。 我发现了几个从本地文件而不是从 URL 进行编码的示例。 有没有可能这样做?

我尝试了类似的方法,但没有成功。任何线索,帮助? 谢谢你的回答。

    public static void main(String[] args)  {
    String imageUrl = "http://www.avajava.com/images/avajavalogo.jpg";
    String destinationFile = "image.jpg";

    try {           
        // Reading a Image file from file system
        URL url = new URL(imageUrl);
        InputStream is = url.openStream();

        FileInputStream imageInFile = new FileInputStream(is.toString());
        byte imageData[] = new byte[2048];
        imageInFile.read(imageData);

        // Converting Image byte array into Base64 String
        String imageDataString = encodeImage(imageData);
        System.out.println("imageDataString : " + imageDataString);




        System.out.println("Image Successfully Manipulated!");
    } catch (FileNotFoundException e) {
        System.out.println("Image not found" + e);
    } catch (IOException ioe) {
        System.out.println("Exception while reading the Image " + ioe);
    }

}

/**
 * Encodes the byte array into base64 string
 *
 * @param imageByteArray - byte array
 * @return String a {@link java.lang.String}
 */
public static String encodeImage(byte[] imageByteArray) {
    return Base64.encodeBase64URLSafeString(imageByteArray);
}

【问题讨论】:

  • FileInputStream imageInFile = new FileInputStream(is.toString()); 这是错误的,请阅读 API 文档,确保您准确理解代码中每一行的作用。
  • 我知道这是错误的部分。我举了一个例子,它拿了一个文件。但我尝试使用 URL 和 InputStream 来调整它

标签: java base64 encode


【解决方案1】:

通过在参数中传递图像 url 来尝试此功能。

private String getByteArrayFromImageURL(String url) {

    try {
        URL imageUrl = new URL(url);
        URLConnection ucon = imageUrl.openConnection();
        InputStream is = ucon.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int read = 0;
        while ((read = is.read(buffer, 0, buffer.length)) != -1) {
            baos.write(buffer, 0, read);
        }
        baos.flush();
        return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
    } catch (Exception e) {
        Log.d("Error", e.toString());
    }
    return null;
}

【讨论】:

    【解决方案2】:

    以下代码将图片转换为base64字符串:

    public String getBase64EncodedImage(String imageURL) throws IOException {
        java.net.URL url = new java.net.URL(imageURL); 
        InputStream is = url.openStream();  
        byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(is); 
        return Base64.encodeBase64String(bytes);
    }
    

    附:以上代码使用commons-io作为依赖。

    【讨论】:

      【解决方案3】:
      /**
           *
           * @param url - web url
           * @return - Base64 String
           * Method used to Convert URL to Base64 String
           */
          public String convertUrlToBase64(String url) {
              URL newurl;
              Bitmap bitmap;
              String base64 = "";
              try {
                  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                  StrictMode.setThreadPolicy(policy);
                  newurl = new URL(url);
                  bitmap = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
                  ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
                  base64 = Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return base64;
          }
      

      【讨论】:

        【解决方案4】:

        你不应该使用 FileInputStream。

        使用类似的东西:

        URL url = new URL(imageUrl);
        BufferedInputStream bis = new BufferedInputStream(url.openConnection().getInputStream());
        

        您还需要循环读取数据,直到您读取图像的所有字节。

        【讨论】:

          【解决方案5】:

          你明白这条线是做什么的吗?

          FileInputStream imageInFile = new FileInputStream(is.toString());
          

          首先它在InputStream 对象上调用toString。这将产生一个类似于:InputStream@23e5aa 的字符串。然后它会尝试打开一个具有该名称的文件。您不想读取名为InputStream@23e5aa 的文件,所以这是完全错误的。

          您想要做的是将原始InputStream is 中的所有字节读入一个字节数组。这个问题的答案中解释了如何做到这一点:

          Convert InputStream to byte array in Java

          【讨论】:

          • 感谢您的解释。最后,我使用了类似的东西。url = new URL(imageUrl); InputStream is = url.openStream(); byte[] bytes = IOUtils.toByteArray(is); imageDataString = encodeImage(bytes);
          猜你喜欢
          • 2019-02-13
          • 2017-01-08
          • 2016-04-04
          • 2015-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多