必须在循环视图上显示图像和贴纸列表(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);
我发现贴纸文件的字节数组长度很大,我可以通过编程方式减少贴纸文件大小吗?我想找到解决方案,减少字节数组的大小。
答案 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比较),或预先重新缩放源位图。