在imageview上显示贴纸时发生了内存不足

时间:2016-12-01 13:15:53

标签: java android arrays bitmap

必须在循环视图上显示图像和贴纸列表(webp格式)。

在imageView上显示贴纸,使用此[存储库](https://github.com/EverythingMe/webp-android)。这个存储库是建议的 这篇文章的解决方案(WebP for Android

贴纸文件从外部存储器转发,转换为字节数组,使用存储库库,字节数组转换为位图,最后位图显示在imageView上。下面的代码将贴纸文件转换为位图

private void ShowStickerOnImageView(String stickerPath){
File file = new File(stickerPath);
int size = (int) file.length();
byte[] bytes = new byte[size];

BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
buf.read(bytes, 0, bytes.length);
buf.close();

Bitmap bitmap = null;
boolean NATIVE_WEB_P_SUPPORT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
if (!NATIVE_WEB_P_SUPPORT) {
    bitmap = WebPDecoder.getInstance().decodeWebP(bytes);
} else {
    bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}

holder.imageView.setImageBitmap(bitmap);
}

.....

public Bitmap decodeWebP(byte[] encoded, int w, int h) {
int[] width = new int[]{w};
int[] height = new int[]{h};

byte[] decoded = decodeRGBAnative(encoded, encoded.length, width, height);
if (decoded.length == 0) return null;

int[] pixels = new int[decoded.length / 4];
ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);

return Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888);
}

当'NATIVE_WEB_P_SUPPORT'为false时,调用'decodeWebP'方法,此方法在大多数情况下都能正常工作,但有时会在此方法上发生“内存不足”错误。大多数情况下,这些错误发生在这些行上

int[] pixels = new int[decoded.length / 4];
ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);
return Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888);

我发现贴纸文件的字节数组长度很大,我可以通过编程方式减少贴纸文件大小吗?我想找到解决方案,减少字节数组的大小。

1 个答案:

答案 0 :(得分:0)

您正在创建一个Bitmap,用作原始尺寸,但已应用于ImageView。将Bitmap减小到View

的大小
Bitmap yourThumbnail= Bitmap.createScaledBitmap(
   theOriginalBitmap,
   desiredWidth,
   desiredHeight,
   false
);

请注意:

public static Bitmap createBitmap(int colors[], int width, int height, Config config) {
    return createBitmap(null, colors, 0, width, width, height, config);
}

将致电

public static Bitmap createBitmap(DisplayMetrics display, int colors[],
        int offset, int stride, int width, int height, Config config)

这将导致:

Bitmap bm = nativeCreate(colors, offset, stride, width, height,
                        config.nativeInt, false);

基本上,你无法在内存中创建巨大的Bitmap。如果这适用于手机,请假设应用程序的大小为20 MB。 一张800 * 600 * 4的图像,大小为1920000字节。降低图像质量,例如使用RGB_565(每像素半字节ammount,与RGB_8888比较),或预先重新缩放源位图。