2013-09-27 61 views
-2

看來我在網上搜索的答案(包括stackoverflow.com)通過圖庫選擇獲取圖像文件ID。給出圖像文件的完整路徑,如何獲取其縮略圖?

我已經創建了我自己的文件資源管理器。 那麼該怎麼做?

我可以創建自己的小尺寸圖像;但我認爲如果我們可以利用現有的縮略圖,速度會更快;如果它不存在,我寧願創建一個保存以供以後使用的縮略圖。

[更新:] 好的,謝謝你的建議。所以我不會在設備中創建縮略圖,以避免使用太多空間。 然後是最好做兩個步驟: 步驟1:如果存在圖像文件,查找現有的縮略圖。 步驟2:如果不存在縮略圖,則創建我自己的小尺寸位圖(不保存它)。

那麼如何做第1步,如果我不使用Gallery意圖?

[Update 2:] 我也想獲取視頻文件的縮略圖。 我可以使用MediaMetadataRetriever在任何時間點獲取幀,並將圖像重新縮放爲縮略圖。但是我發現它很慢:我在文件夾中有4個視頻文件,我可以感覺到延遲。

所以我認爲更好的方式來檢索現有的縮略圖。 如果我只知道文件路徑和文件名,我該如何得到它? 我覺得這個問題和我原來的問題是一樣的,只是這樣做更有意義。

回答

0

您不應該使用特定文件進行tumbnail,特別是不要創建縮略圖。如果用戶有很多圖像,並且存儲了每個在瀏覽器中查看的圖片的縮略圖,該怎麼辦?這會產生大量重複和不需要的數據。每次調整圖像大小的計算都會超過需要存儲的數據量。

我建議你在資源管理器中的圖像上有一個默認圖標,然後調整圖像在不同線程中的大小,在調整大小時替換默認的縮略圖。

+0

感謝您的建議。如果我想利用現有的縮略圖(如果存在),有可能嗎? – user1914692

+0

我真的不知道這是怎麼可能的,Java通常對檢索文件的詳細信息的支持非常不好。即使在計算機上,獲取有關縮略圖等信息也可能非常棘手。 – SiXoS

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); 

你可以在現有文件的一個單獨的線程範圍內的負載並只在需要時更新那些。

+0

謝謝。我知道如何創建一個小尺寸的位圖。我只是覺得如果現有的縮略圖存在,可能會更好?當我不使用Gallery意圖時是否可以檢索它? – user1914692

0

您可以使用ThumbnailUtils。查看這個實用方法。可能適合你的需要,沒有太多的麻煩。創建重複縮小的圖像是一個糟糕的設計,因爲它會結束不必要的數據。

Bitmap resizedImage = ThumbnailUtils.extractThumbnail(rescaledImage, imagePixel, imagePixel); 
+0

我個人認爲如果我第一次得到「rescaledImage」的位圖(我需要調整它的大小,因爲很多原始圖像的尺寸很大),然後使用extractThumbnail獲得更小的尺寸,我會在Eudhan建議的一步中完成。 – user1914692

+0

好..你不需要重新調整的圖像。你可以在裏面放入任何你想要的圖像,然後你給它一個高度和寬度..然後你就會得到那個圖像。這個代碼是我的,我沒有改變這個變量 – Guru

相關問題