我需要上传图片的服务器有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。如何将图像缩小到一定大小限制以下?
答案 0 :(得分:1)
我认为问题正在发生,因为您正在将图像压缩到内存表示中,您需要在尝试再次压缩之前释放该内存。
您需要在再次尝试之前在photoStream中调用close()
以释放资源。
另外toByteArray()
在内存中制作了一个你必须在以后释放的流的副本,为什么不用photoStream.size()
来检查文件大小?
如果需要,我可以发布一些代码。
答案 1 :(得分:1)
而不是:
pic = null;
这样做:
if (pic!=null)
pic.recycle();
pic = null
如果只是将位图对象设置为null,则它所占用的内存不会立即释放。在第二种情况下,您明确告诉操作系统您完成了位图,并且可以释放其内存。
另外考虑使用90而不是100的压缩质量,我相信会减少所产生的文件大小。