在上传之前将图像缩小到大小限制以下

时间:2011-09-27 23:07:25

标签: android

我需要上传图片的服务器有2MB的限制。

我正在使用此方法对位图Strange out of memory issue while loading an image to a Bitmap object

进行下采样

在这个方法中

public InputStream getPhotoStream(int imageSizeBytes) throws IOException {
        int targetLength = 1500;
        ByteArrayOutputStream photoStream;
        byte[] photo;
        Bitmap pic;
        final int MAX_QUALITY = 100;
        int actualSize = -1;
        do {
            photo = null;
            pic = null;
            photoStream = null;

            //this calls the downsampling method
            pic = getPhoto(targetLength);

            photoStream = new ByteArrayOutputStream();
            pic.compress(CompressFormat.JPEG, MAX_QUALITY, photoStream);
            photo = photoStream.toByteArray();
            actualSize = photo.length;
            targetLength /= 2;
        } while (actualSize > imageSizeBytes);
        return new ByteArrayInputStream(photo);
}

这会在第二次迭代时抛出OutOfMemoryError。如何将图像缩小到一定大小限制以下?

2 个答案:

答案 0 :(得分:1)

我认为问题正在发生,因为您正在将图像压缩到内存表示中,您需要在尝试再次压缩之前释放该内存。

您需要在再次尝试之前在photoStream中调用close()以释放资源。 另外toByteArray()在内存中制作了一个你必须在以后释放的流的副本,为什么不用photoStream.size()来检查文件大小?

如果需要,我可以发布一些代码。

答案 1 :(得分:1)

而不是:

pic = null;

这样做:

if (pic!=null)
    pic.recycle();
pic = null

如果只是将位图对象设置为null,则它所占用的内存不会立即释放。在第二种情况下,您明确告诉操作系统您完成了位图,并且可以释放其内存。

另外考虑使用90而不是100的压缩质量,我相信会减少所产生的文件大小。