Base64 encodeBytes - 内存不足异常

时间:2012-02-22 07:01:29

标签: android

我试图将图片从android上传到远程服务器。除了大照片外,一切正常。我在Base64.encodeBytes()方法中获得“异常内存”。这是代码。

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
byte [] byte_arr = stream.toByteArray();
String image_str = Base64.encodeBytes(byte_arr);

你能帮助我解决这个问题吗?我试图通过以前对位图进行取样来解决这个问题,它可以工作,但它缩小了位图,我总是希望以原始大小上传图片。

感谢。

4 个答案:

答案 0 :(得分:1)

之前我对大图片有同样的问题...在将其转换为Base64之前我刚刚缩放了位图...你可以将它用作以下...

bitmap=Bitmap.createScaledBitmap(bitmap, 100, 100, true);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); //compress to which format you want.
byte [] byte_arr = stream.toByteArray();
String image_str = Base64.encodeBytes(byte_arr);

答案 1 :(得分:0)

您可以尝试更改压缩的质量参数,就像我刚刚给出的10&它也适用于大图像。

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 10, stream); 
byte [] byte_arr = stream.toByteArray();
String image_str = Base64.encodeBytes(byte_arr);

答案 2 :(得分:0)

基于这些陈述:

  

1-我试图将图片从android上传到远程服务器。

     

2-但它缩放了bimap仪式?我想上传它   原始图片。

只要解决方案可以帮助您从Android应用程序将文件上传到服务器并保留原始图像,我将假设任何答案都可以。

解决方案 - 从下面的教程中移除压缩,它应该在你的路上发送给你。

http://vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http-post-multi-part/

避免使用Base64.encodeBytes()来处理大型图片文件。

答案 3 :(得分:0)

我找到了将图像的原始大小上传到服务器的解决方案:

public static void upload(String pathToOurFile, String serverUrl){
    HttpURLConnection connection = null;
    DataOutputStream outputStream = null;
    DataInputStream inputStream = null;

    String urlServer = serverUrl;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary =  "*****";

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1*1024*1024;

    try
    {
    FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) );

    URL url = new URL(urlServer);
    connection = (HttpURLConnection) url.openConnection();

    // Allow Inputs & Outputs
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);

    // Enable POST method
    connection.setRequestMethod("POST");

    connection.setRequestProperty("Connection", "Keep-Alive");
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

    outputStream = new DataOutputStream( connection.getOutputStream() );
    outputStream.writeBytes(twoHyphens + boundary + lineEnd);
    outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd);
    outputStream.writeBytes(lineEnd);

    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    buffer = new byte[bufferSize];

    // Read file
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0)
    {
    outputStream.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }

    outputStream.writeBytes(lineEnd);
    outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

    // Responses from the server (code and message)
    int serverResponseCode = connection.getResponseCode();
    String serverResponseMessage = connection.getResponseMessage();

    fileInputStream.close();
    outputStream.flush();
    outputStream.close();
    }
    catch (Exception ex)
    {
    //Exception handling
    }
}