什么是MINI_THUMB_MAGIC,如何使用它?

6

背景

我注意到了一个奇怪的列,它是关于MediaStore.Images.ImageColumns的,名为"MINI_THUMB_MAGIC"。

文档只是这样描述:

mini缩略图id。

类型:INTEGER

常量值:"mini_thumb_magic"

问题

我的猜测是这个字段与MediaStore.Images.Thumbnails有关。

对吗?如果不是,那它是什么,如何使用?

如果是,我还有其他相关问题:

  1. 它是原始图片的迷你尺寸版吗?它使用相同的长宽比还是进行了居中裁剪?

  2. 为什么“MICRO”大小是正方形(96 x 96),而“MINI”大小是非正方形矩形(512 x 384)?

  3. 如何使用它?我的猜测是通过使用一个blob类型的"THUMB_DATA"字段来完成,就像这样一样,但是如果你已经有了这个字段,使用"getThumbnail"有什么用呢?

  4. 如果方向值不为0,它是否会得到旋转的缩略图?也就是说,如果我想要显示它,我不需要旋转图片吗?

  5. 是否可以查询带有它们的缩略图的图片?是否可以使用内部连接?

  6. 它是否适用于所有Android设备和版本?

  7. 为什么它被称为“magic”?是因为它也适用于视频(由于某种原因,例如可能是专辑封面照片,它不存在于音乐中)吗?

3个回答

2
请查看此文件:https://github.com/android/platform_packages_providers_mediaprovider/blob/master/src/com/android/providers/media/MediaThumbRequest.java,它是Android源代码中的一个魔数,可以确定缩略图是否仍然有效。我没有深入研究这个文件,但应该不难深入了解。回答您的问题:
  1. 没有迷你尺寸的图像。
  2. 我想这是Google定义的,他们希望在某些列表中有一个正方形的缩略图,只能显示非常小的预览,并且需要适合屏幕上的许多项目,还有另一种缩略图格式,其中图像更大...
  3. 我不知道,但根据Google的文档,其中一个(THUMB_DATA)只是缩略图的一些原始字节数组(不知道以哪种格式),而另一个(getThumbnail)检索完整的位图对象...
  4. 不知道。
  5. 不知道。
  6. 我想是的,因为它是AOSP源代码的一部分。
  7. "Magic"一词经常用于某种标识符。有“魔法数据包”,可以通过网络唤醒计算机从睡眠或关机状态中恢复,硬盘上有魔法数字,在某些扇区(例如MBR)的最后两个字节位置上具有十六进制值AA 55,图像文件中也有魔法数字,它们帮助软件包确定图像类型(例如GIF文件以GIF89a或GIF87a(ASCII)开头,JPEG文件以FF D8十六进制开头),还有许多其他例子。因此,魔数在这里是一个非常常见的术语 :-)。

有趣。既然我已经离开了这个问题,无法检查并标记它,但因为你花时间回答,所以你得到+1。也许将来我会打勾的。 - android developer
@androiddeveloper 未来已经到来。您可能应该授予TomS正确的答案。 - JohnnyLambada

0

这是一个有点奇怪的参数...
在探索画廊源代码时,
注意到该值是从光标中读取的,但从未被使用:

@Override
    protected BaseImage loadImageFromCursor(Cursor cursor) {
        long id = cursor.getLong(INDEX_ID);
        String dataPath = cursor.getString(INDEX_DATA_PATH);
        long dateTaken = cursor.getLong(INDEX_DATE_TAKEN);
        if (dateTaken == 0) {
            dateTaken = cursor.getLong(INDEX_DATE_MODIFIED) * 1000;
        }

// 在这里,他们读取它 ====>>

        long miniThumbMagic = cursor.getLong(INDEX_MINI_THUMB_MAGIC);
        int orientation = cursor.getInt(INDEX_ORIENTATION);
        String title = cursor.getString(INDEX_TITLE);
        String mimeType = cursor.getString(INDEX_MIME_TYPE);
        if (title == null || title.length() == 0) {
            title = dataPath;
        }

// 而不使用 ==>>>

        return new Image(this, mContentResolver, id, cursor.getPosition(),
                contentUri(id), dataPath, mimeType, dateTaken, title,
                orientation);
    } 

可能它曾经在以前的API中被使用过。

参考:https://android.googlesource.com/platform/packages/apps/Gallery/+/android-8.0.0_r12/src/com/android/camera/gallery/ImageList.java?autodive=0%2F%2F
以及视频列表: https://android.googlesource.com/platform/packages/apps/Gallery/+/android-8.0.0_r12/src/com/android/camera/gallery/VideoList.java?autodive=0%2F%2F


0
根据以下网址的源代码,魔数是原始图像的ID乘以一个常量。然后使用该值来检查长整型数据。如果该整数不符合预期,则表示它与图像媒体不同步。

http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/4.4_r1-robolectric-0/android/media/MiniThumbFile.java#MiniThumbFile.getMagic%28long%29

// Get the magic number for the specified id in the mini-thumb file.
// Returns 0 if the magic is not available.
public synchronized long getMagic(long id) {
   // check the mini thumb file for the right data.  Right is
   // defined as having the right magic number at the offset
   // reserved for this "id".
   RandomAccessFile r = miniThumbDataFile();
   if (r != null) {
       long pos = id * BYTES_PER_MINTHUMB;
       FileLock lock = null;
       try {
           mBuffer.clear();
           mBuffer.limit(1 + 8);

           lock = mChannel.lock(pos, 1 + 8, true);
           // check that we can read the following 9 bytes
           // (1 for the "status" and 8 for the long)
           if (mChannel.read(mBuffer, pos) == 9) {
               mBuffer.position(0);
               if (mBuffer.get() == 1) {
                   return mBuffer.getLong();
               }
           }
       } catch (IOException ex) {
           Log.v(TAG, "Got exception checking file magic: ", ex);
       } catch (RuntimeException ex) {
           // Other NIO related exception like disk full, read only channel..etc
           Log.e(TAG, "Got exception when reading magic, id = " + id +
                   ", disk full or mount read-only? " + ex.getClass());
       } finally {
           try {
               if (lock != null) lock.release();
           }
           catch (IOException ex) {
               // ignore it.
           }
       }
   }
   return 0;
}

当我尝试通过查找缩略图的路径来获取原始ID时,出现了运行时异常。(顺便说一下,磁盘不是满的,也不是只读的。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接