Bitmap.createBitmap& UpOfMemory转换为Base64

时间:2017-05-02 16:54:41

标签: android image base64

有时在某些移动设备上,图像转换为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;
    }

1 个答案:

答案 0 :(得分:0)

您应该在旋转之前缩放图像。

如果先缩小比例,则需要旋转的像素更少,从而节省内存。

您还应该在使用完毕后直接发出.recycle()次来电,而不是全部都在功能结束时。

作为非常非常非常的最后手段,您可以在清单中将android:largeHeap="true"添加到您的应用程序中,这很可能会为您提供更多可用内存。
有关largeHeap的具体细节,请阅读此处的文档:
https://developer.android.com/guide/topics/manifest/application-element.html