如果图像高于设备的最大纹理大小,我需要剪切一些图像,如果它们不是,则不要执行任何操作。 根据文档,由于我将进行大小调整,因此我需要使用以下方法:
CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory);
这意味着即使我不必这样做,我也必须创建一个新的位图。(如果图像的大小不大于最大纹理大小(。这意味着更多的内存使用和更多的 CUP 时间花费。我的问题是,有没有办法只在需要时应用这种后处理。
这是我的过程函数
@Override
public CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory) {
final int height = sourceBitmap.getHeight();
final int maxTextureSize = ImageUtils.getMaxTextureSize();
if (height > maxTextureSize) {
return bitmapFactory.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), maxTextureSize,
sourceBitmap.getConfig());
} else {
return bitmapFactory.createBitmap(sourceBitmap);
}
}
得到了Facebook朋友的一些帮助,使用区域解码器部分解码一个巨大的位图将解决这个问题并变得更加内存友好。
他们提供的示例如下:
https://github.com/facebook/fresco/blob/baa629dd46797a3342a50b918ea0989b63819c87/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/imagepipeline/ImagePipelineRegionDecodingFragment.java