Bitmap占用内存过大

从图库中选择一张大概5兆的图片,然后根据Uri生成Bitmap对象,突然发现生成的Bitmap对象占用内存大小有40多M了,想知道这种情况正常吗?还有我要将这个Bitmap上传到服务器(是通过将Bitmap转换成String以参数的形式通过post上传),这么大也上传不了,压缩又会使图片变得不清晰,请问有什么好的解决办法吗?

 public String pconvertIconToString(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        byte[] Fullfacephoto = byteArrayOutputStream.toByteArray();
        return Base64.encodeToString(Fullfacephoto, Base64.DEFAULT);
    }
 requestParams.addBodyParameter("clientId", clientId);
            requestParams.addBodyParameter("telephone", telephone);
            requestParams.addBodyParameter("linkMan", linkMan);
            requestParams.addBodyParameter("linkManSex", linkManSex.toString());
            requestParams.addBodyParameter("shopName", shopName);
            requestParams.addBodyParameter("country", country);
            requestParams.addBodyParameter("province", province);
            requestParams.addBodyParameter("city", city);
            requestParams.addBodyParameter("area", area);
            requestParams.addBodyParameter("detailAddr", detailAddr);
            requestParams.addBodyParameter("busilicenceNo", busilicenceNo);
            requestParams.addBodyParameter("shopDescription", shopDescription);
            requestParams.addBodyParameter("categoryId", categoryId.toString());
            //下面这些是要传的图片
            requestParams.addBodyParameter("busilicenceImg", busilicenceImg);
            requestParams.addBodyParameter("shopCoverImg", shopCoverImg);
            requestParams.addBodyParameter("shopInsideImg_1", shopInsideImg_1);
            requestParams.addBodyParameter("shopInsideImg_2", shopInsideImg_2);

通过上述方法将bitmap转换返回一个String作为参数传递,和其他参数一起传递的。请问有人这样上传过图片吗?

阅读 4.9k
6 个回答

一定要将图片读取到 Bitmap 吗?

显示的话,有 Uri 就可以直接显示了。然后文件的话可以直接转 byte 数组,比如:

File file = new File(path);
int size = (int) file.length();
byte[] bytes = new byte[size];
try {
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
    buf.read(bytes, 0, bytes.length);
    buf.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

不过标准做法还是用 File 或者 Uri 构造 MultiPart 的请求体来上传,建议还是和服务端讨论一下。

尝试一下调整接口,使用文件上传的形式,先传那些信息,图片用另一个接口上传。估计是你们后台想偷懒,嘿嘿

直接用文件流的形式传吧, 不要去加载成Bitmap, 文件流可以根据缓冲区大小边读边传

Bitmap的大小与图片文件的大小是两个不同的概念,图片文件通常有规定的压缩格式,会小很多,比如:jpge,png等等。
bitmap是解码后的图像数据,它的大小略大于 图片长x图片宽x图片格式所占的字节(例如:ARGB占用8个字节),所以bitmap对象占用内存变大是正常的。
至于图片上传,建议用byte的形式上传图片文件本身,而不是bitmap,因为bitmap是解码后的数据,不适合用作序列化保存。
如果一定要用String来传的话(很烂的选择),那么你可以用Base64转码,避免特殊字符保存出问题。

谢谢大家的解答

图片加载可以用一些成熟的图片加载库 也可以加载本地图片的 但是 当然图片被压缩过了 不过你手机上也看不出太大的差别

上传可以直接用formdata做 很顺溜

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题