有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android post高分辨率图像内存不足

大家好

我正忙着让安卓从应用程序上传图像
我也让它工作(代码如下)
但当我发送大图像(1000万像素)时,我的应用程序会崩溃,出现内存不足的异常
一个解决方案是使用压缩,但是如果我想发送全尺寸的图像呢
我想可能有溪流,但我不熟悉溪流。也许urlconnection可能会有帮助,但我真的不知道

我将文件名命名为File[0到9999]。jpg 带有图像日期的post值称为Filedata 我为post值dropboxid提供了一个UID

下面的代码可以工作,但我想解决我的问题,阻止我发送高分辨率图像

问候

try
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 100, bos);
    byte[] data = bos.toByteArray();

    HttpPost postRequest = new HttpPost(URL_SEND);

    ByteArrayBody bab = new ByteArrayBody(data, "File" + pad(random.nextInt(9999) + 1) + ".jpg");
    MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("Filedata", bab);
    reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));
    postRequest.setEntity(reqEntity);

    HttpResponse response = httpClient.execute(postRequest);
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    String sResponse;
    StringBuilder s = new StringBuilder();

    while((sResponse = reader.readLine()) != null)
    {
        s = s.append(sResponse);
    }

    if(d) Log.i(E, "Send response:\n" + s);
}
catch (Exception e)
{
    if(d) Log.e(E, "Error while sending: " + e.getMessage());
    return ERROR;
}

共 (1) 个答案

  1. # 1 楼答案

    当使用ByteArrayOutputStream然后调用#toByteArray()时,JPEG使用的内存量实际上是的两倍ByteArrayOutputStream保留一个带有编码JPEG的内部数组,当您调用#toByteArray()时,它会分配一个新的数组&;从内部缓冲区复制数据

    考虑将大位图编码为临时文件&使用FileOutputStreamFileInputStream编码并发送图像

    不需要“上传”——你们的应用程序就可以“很好地”保存下来,我猜内存中只有巨大的位图

    编辑:FileBody

    File img = new File(this is where you put the path of your image)
    ContentBody cb = new FileBody(img, "File" + pad(random.nextInt(9999) + 1) + ".jpg", "image/jpg", null);
    MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("Filedata", cb);
    reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));