-2

看来我在网上搜索的答案(包括stackoverflow.com)是通过画廊选择获得图像文件ID的。

我创建了自己的文件资源管理器。那么该怎么做呢?

我可以创建自己的小尺寸图像;但我认为如果我们可以利用现有的缩略图会更快;如果它不存在,我宁愿创建一个缩略图以供以后使用。

[更新:]好的,谢谢您的建议。所以我不会在设备中创建缩略图,以免占用太多空间。那么最好做两个步骤: 步骤 1:查找图像文件的现有缩略图(如果存在)。第 2 步:如果不存在缩略图,则创建我自己的小尺寸位图(不保存它)。

如果我不使用 Gallery 意图,那么如何执行第 1 步?

[更新 2:] 我还想获取视频文件的缩略图。我可以使用 MediaMetadataRetriever 在任何时间点获取帧,并将图像重新缩放为缩略图。但我发现它很慢:我的文件夹中有 4 个视频文件,我可以感觉到延迟。

所以我认为检索现有缩略图的更好方法。如果我只知道文件路径和文件名,我怎么能得到呢?我认为这个问题与我原来的问题相同,只是这样做更有意义。

4

3 回答 3

0

您不应该为缩略图使用特定文件,尤其是不要创建缩略图。如果用户有很多图像,并且您存储了在您的资源管理器中查看的每张图片的缩略图怎么办。这将产生大量重复和不需要的数据。每次调整图像大小的计算都超过了需要存储的数据量。

我建议您在资源管理器中的图像上使用默认图标,然后在不同的线程中调整图像的大小,在调整大小时替换您的默认缩略图。

于 2013-09-27T16:52:55.200 回答
0

您可以使用 ThumbnailUtils。查找此实用程序方法。可能很容易满足您的需求。创建重复的缩小图像是一个糟糕的设计,因为它最终会产生不必要的数据。

Bitmap resizedImage = ThumbnailUtils.extractThumbnail(rescaledImage, imagePixel, imagePixel);
于 2013-09-27T17:36:51.977 回答
0

您可以即时缩小现有图像的大小:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;

BitmapFactory.decodeFile(image_path, opts);
int width = opts.outWidth;
int height = opts.outHeight;

然后

opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
opts.inDither = true;
opts.inJustDecodeBounds = false;

opts.inSampleSize = (int)Math.pow(2.0,Math.floor(Math.log(scale_factor)/Math.log(2)));//for example double scale_factor=(double)width/desired_dimension;

最后:

Bitmap bm = BitmapFactory.decodeFile(image_path,opts);

您可以加载现有文件的单独线程范围,并在需要时仅更新那些文件。

于 2013-09-27T17:03:36.447 回答