在Java中将URL中的图像编码为Base64

12

我希望能够对来自URL的图片进行Base64编码和保存。 我找到了几个例子可以从本地文件进行编码,但不是从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文档,确保您完全理解代码中每一行的作用。 - Jesper
我知道这是错误的部分。我拿了一个以文件为例子的代码。但我试图用URL和InputStream进行调整。 - skunk a
5个回答

13

通过将图片 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;
}

对于多次下载,请添加ucon.setRequestProperty("connection","close"); - undefined

6
以下代码将图像转换为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作为依赖项。


6
/**
     *
     * @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());

您需要在循环中读取数据,直到读取完整张图片的所有字节。

0

你理解这行代码的作用吗?

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

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

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

在Java中将InputStream转换为字节数组


1
感谢您的解释。最终,我使用了类似这样的代码:url = new URL(imageUrl); InputStream is = url.openStream(); byte[] bytes = IOUtils.toByteArray(is); imageDataString = encodeImage(bytes); - skunk a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接