有时在某些移动设备上,图像转换为Base64字符串会因为巨大的大小而得到OutOfMemoryError(如果是base64字符串(当原始图像&它调整大小时 - 不会过重)。有没有办法在没有Outofmemory异常的情况下获得更适度的字符串大小?在我的代码中,我调整了图像和放大压缩......但无论如何,最终Base64字符串的大小都很大。
public String getBase64Image() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(getFileInst().getAbsolutePath(), options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int currentWidth = options.outWidth;
int currentHeight = options.outHeight;
int maxSize = Math.max(currentHeight, currentWidth);
double diff = 1;
if (maxSize > maxAcceptableImageSize) {
diff = (double)maxAcceptableImageSize / maxSize;
}
Matrix matrix = new Matrix();
int rotate = getCameraPhotoOrientation(getImage().getContext(), getFileInst().getAbsolutePath());
matrix.preRotate(rotate);
Bitmap image;
Bitmap src = Bitmap.createBitmap(BitmapFactory.decodeFile(getFileInst().getAbsolutePath()), 0, 0,
currentWidth, currentHeight, matrix, false);
if (diff <= 1) {
image = Bitmap.createScaledBitmap(src, (int)(src.getWidth() * diff), (int)(src.getHeight() * diff), false);
} else {
image = src;
}
image.compress(Bitmap.CompressFormat.PNG, 75, baos);
byte[] byteArrayImage = baos.toByteArray();
String base64Str = "data:image/png;base64," + Base64.encodeToString(byteArrayImage, Base64.DEFAULT);
src.recycle();
image.recycle();
return base64Str;
}
答案 0 :(得分:0)
您应该在旋转之前缩放图像。
如果先缩小比例,则需要旋转的像素更少,从而节省内存。
您还应该在使用完毕后直接发出.recycle()
次来电,而不是全部都在功能结束时。
作为非常非常非常的最后手段,您可以在清单中将android:largeHeap="true"
添加到您的应用程序中,这很可能会为您提供更多可用内存。
有关largeHeap的具体细节,请阅读此处的文档:
https://developer.android.com/guide/topics/manifest/application-element.html