Hacker white 2024-01-12 17:25 采纳率: 55.6%
浏览 36
已结题

Images.Thumbnails.getThumbnail获取的竟然是图片Exif里的Thumbnail?

发现通过getThumbnail获取的图片实际上是图片信息Exif里的Thumbnails图 但是分析getThumbnail源码又没发现里面有取Exif里的Thumbnails图的逻辑,有没有人帮忙看看这段源码分析下它的逻辑 如果图片里Exif里Thumbnails图没有 它又会怎么取图

bitmap = Images.Thumbnails.getThumbnail(resolver, image.idImages.Thumbnails.MINI_KIND, null);

/**
 *返回代表特定图像项的缩略图。如果缩略图不存在,则此方法将阻塞,直到生成缩略图为止。
 *调用者对自己的内存负责缓存返回值。
 *从{@link android.os.Build.VERSION_CODES#Q}开始,缩略图的输出具有正确的旋转,不需要再次旋转。
 *@param imageId 要获取缩略图的图像项。
 *@param 类型所需的最佳缩略图大小。
 *@return 解码后的缩略图,如果遇到问题则返回 {@code null}。
 *@deprecated 调用者应该迁移到使用 {@link ContentResolver#loadThumbnail},
 *因为它可以对请求的缩略图大小和取消行为提供更丰富的控制。
 */
@Deprecated
public static Bitmap getThumbnail(ContentResolver cr, long imageId, int kind,
         BitmapFactory.Options options) {
    final Uri uri = ContentUris.withAppendedId(
        Images.Media.EXTERNAL_CONTENT_URI, imageId);
    return InternalThumbnails.getThumbnail(cr, uri, kind, options);
}



/**
 *发出阻塞请求以获取给定的缩略图,并在需要时生成它。
 */
@Deprecated
static @Nullable Bitmap getThumbnail(@NonNull ContentResolver cr, @NonNull Uri uri,
        int kind, @Nullable BitmapFactory.Options opts) {
    final Size size = ThumbnailConstants.getKindSize(kind);
    CancellationSignal signal = null;
    synchronized (sPending) {
        signal = sPending.get(uri);
        if (signal == null) {
            signal = new CancellationSignal();
            sPending.put(uri, signal);
        }
    } 
    try {
        return cr.loadThumbnail(uri, size, signal);
    } catch (IOException e) {
        Log.w(TAG, "Failed to obtain thumbnail for " + uri, e);
    } finally {
        synchronized (sPending) {
             sPending.remove(uri);
        }
    }
}
  • 写回答

12条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-01-12 17:30
    关注

    Images.Thumbnails.getThumbnail这个函数的主要目的是从Android的media库中获取一个图片的缩略图。它首先会创建一个用于获取图片的Uri,然后该Uri被传递到InternalThumbnails.getThumbnail()。
    在InternalThumbnails.getThumbnail()中,它通过调用ContentResolver的loadThumbnail()获取缩略图。loadThumbnail()方法依据Uri和传入的尺寸,为你加载一个图片的缩略图。如果缩略图不存在,那么这个方法会生成一个。缩略图的尺寸是按照ThumbnailConstants.getKindSize(kind)所返回的结果生成的。根据Android文档,ThumbnailConstants.MINI_KIND返回的是512 x 384大小的缩略图。
    关于你的疑问,如果在Exif数据中没有缩略图,则loadThumbnail()会尝试生成一个缩略图。如果生成失败,会返回一条错误信息,并且getThumbnail()函数返回null。
    这一切都是在源码中看不出来的,因为具体的实现依赖于Android系统对图片和媒体库处理的细节,这些都被封装在底层的代码中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(11条)

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月18日
  • 创建了问题 1月12日