画像と動画のサムネ取得方法まとめ
ここでは画像と動画のサムネイルを取得する方法の中で比較的高速なものをいくつか紹介します。
画像のサムネ取得方法その1
まずはContentResolverを使った画像のサムネの取得方法です。
以下がコード例です。
Bitmap thumbnail = null; ContentResolver cr = getContentResolver(); /** 画像をファイルパスから検索 */ Cursor cursor = cr.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.ImageColumns.DATA + " = ?", new String[]{"ファイルパス"}, null); if(cursor != null && cursor.moveToFirst()){ /** 画像のIDを取得 */ long id = cursor.getLong(cursor.getColumnIndex("_id")); /** IDから96x96のサムネイルを取得 */ thumbnail = MediaStore.Images.Thumbnails.getThumbnail( cr, id, MediaStore.Images.Thumbnails.MICRO_KIND, null); cursor.close(); } if(cursor != null) cursor.close();
画像パスからデータベースに登録されている画像のIDを取得し、MediaStore.Images.Thumbnails.getThumbnailにそのIDを渡してサムネイルを取得しています。
この方法はAndroidのシステムのデータベースから画像を呼び出すだけなので、次に紹介する画像を直接縮小する方法より早いです。
なので、なるべくならこの方法を使うのが好ましいと思います。
画像のサムネ取得方法その2
次は画像を読み込んでそれを縮小してサムネイルにする方法です。
と言っても、そのまま画像を読み込むとメガ単位のファイルの場合は恐ろしく時間がかかってしまうのでBitmapFactoryのOptionsを有効活用します。
以下がそのコードです。
Bitmap thumbnail = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile("ファイルパス", options); /** 横の縮尺を求める */ int scaleW = options.outWidth / 96 + 1; /** 縦の縮尺を求める */ int scaleH = options.outHeight / 96 + 1; int scale = Math.max(scaleW, scaleH); options.inJustDecodeBounds = false; options.inSampleSize = scale; thumbnail = BitmapFactory.decodeFile(filePath, options);
このコードではまずメモリ上に画像を展開しないためにinJustDecodeBoundsをtrueに設定してその後いったん画像を読み込んでいます。
その後、縮尺のスケールを求めています。
例えば960x960の画像を96x96にまで縮尺したい場合、スケールは960/96=10になります。
そしてinSampleSizeにそのスケールを渡します。
このinSampleSizeを設定しておくと(元画像の大きさ/inSampleSize)の大きさで画像を読み込んでくれます。
後は普通にdecodeFileを呼び出せばサムネイルが手に入るというわけです。
これが2つめの画像サムネの取得方法です。
動画のサムネ取得方法
最後に動画のサムネですが、これは簡単でThumbnailUtilsを使うだけでサムネが手に入ります。
Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail("ファイルパス", MediaStore.Images.Thumbnails.MICRO_KIND);
ファイルパスの後に渡している引数がサムネの大きさでMICRO_KIND(96×96)とMINI_KIND(512×384)のどちらかを選べます。
以上、画像と動画のサムネの取得について簡単にまとめてみました。では、また!