Glide原理(三):图片解析处理、ImageView保证大小

本文探讨Glide如何计算图像大小、处理角度、解码及旋转图像,重点关注BitmapOptions参数和关键类的作用。Glide利用BitmapPool、DisplayMetrics、ArrayPool以及ImageHeaderParser解析图像头部信息,通过Downsampler进行解码和旋转。同时,Glide通过ViewTreeObserver确保ImageView的宽高适应。
摘要由CSDN通过智能技术生成

Glide 怎么判断解析图片的

Glide 怎么保证ImageView宽高?

Glide 怎么判断图片旋转角度


以上三个问题是我自己在做一个图片池遇到的问题,趁机好好学习Glide

Glide解码的类在 Downsampler中,它的注释上写着:

Downsamples, decodes, and rotates images according to their exif orientation.

根据图像文件采样、解码、旋转图像

有几个重要的类:
  • private final BitmapPool bitmapPool;

Bitmap池,是一个LruCache,内部保留着使用过的Bitmap,重复使用

  • private final DisplayMetrics displayMetrics;

屏幕信息

  • private final ArrayPool byteArrayPool;

同样是一个LruCache,最大是4MB,充当一个byte的buffer

  • private final List parsers;

图像的头部信息解析器,例如图像类型、旋转角度等信息;

ImageHeaderParser有两个实现类:DefaultImageHeaderParser、 ExifInterfaceImageHeaderParser

DefaultImageHeaderParser是Glide自定义的默认的头部解析器

ExifInterfaceImageHeaderParser是支持SDK 27的基于 exifInterface的解析器

  • private final HardwareConfigState hardwareConfigState = HardwareConfigState.getInstance();

目测跟硬件加速有关,具体还不清楚

计算图像大小、缩放、计算角度、解码、旋转
public Resource<Bitmap> decode(InputStream is, int requestedWidth, int requestedHeight,
      Options options, DecodeCallbacks callbacks) throws IOException {
   

	// 以下具体是做一系列的BitmapFactory.Options的配置
    byte[] bytesForOptions = byteArrayPool.get(ArrayPool.STANDARD_BUFFER_SIZE_BYTES, byte[].class);
    BitmapFactory.Options bitmapFactoryOptions = getDefaultOptions(); // 获取Option
    bitmapFactoryOptions.inTempStorage = bytesForOptions; // 设定一个可重复使用的临时存储空间

    DecodeFormat decodeFormat = options.get(DECODE_FORMAT);
    DownsampleStrategy downsampleStrategy = options.get(DownsampleStrategy.OPTION);
    boolean fixBitmapToRequestedDimensions = options.get(FIX_BITMAP_SIZE_TO_REQUESTED_DIMENSIONS); 
    boolean isHardwareConfigAllowed =
      options.get(ALLOW_HARDWARE_CONFIG) != null && options.get(ALLOW_HARDWARE_CONFIG); // 是否允许硬件加速

    try {
   
	  // 进行解码流程
      Bitmap result = decodeFromWrappedStreams(is, bitmapFactoryOptions,
          downsampleStrategy, decodeFormat, isHardwareConfigAllowed, requestedWidth,
          requestedHeight, fixBitmapToRequestedDimensions, callbacks);
      return BitmapResource.obtain(result, bitmapPool);
    } finally {
   
      releaseOptions(bitmapFactoryOptions);
      byteArrayPool.put(bytesForOptions);
    }
  }
  
  // 真正解码的流程
  private Bitmap decodeFromWrappedStreams(InputStream is,
      BitmapFactory.Options options, DownsampleStrategy downsampleStrategy,
      DecodeFormat decodeFormat, boolean isHardwareConfigAllowed, int requestedWidth,
      int requestedHeight, boolean fixBitmapToRequestedDimensions,
      DecodeCallbacks callbacks) throws IOException {
   
    
	//1. 计算图像大小
    int[] sourceDimensions = getDimensions(is, options, callbacks, bitmapPool);
    int sourceWidth = sourceDimensions[0];
    int sourceHeight = sourceDimensions[1];
    String sourceMimeType = options.outMimeType;

    if (sourceWidth == -1 || sourceHeight == -1) {
   
      isHardwareConfigAllowed = false;
    }
    
	//2. 计算图像角度
    int orientation = ImageHeaderParserUtils.getOrientation(parsers, is
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值