アラのアラアラしい日記

こっそりかいてます

androidでBitmapを縦横比を維持しながらスケールする方法

こんにちは!メガネ萌えする人です!
今回はandroidネタです。

ビデオのサムネイルをBitmapで取得した時の表示のさせ方について、若干はまったのでメモです。
サムネをレイアウトの中で3:4の比率で表示させようとした時に、思ったように拡大縮小されなかったんですね〜
ただ、調べていると色々な方法があるようなので、その中の一つとして見てもらえればと。

fileName = "***動画ファイル名***"

// サムネイルをBitmapとして取得
Bitmap bmp = ThumbnailUtils.createVideoThumbnail(CommonUtils.getAvailableDirectory() + fileName, MediaStore.Video.Thumbnails.MINI_KIND);

// 作られたサムネイルから横幅とそれに応じた高さを指定
int dispWidth = bmp.getWidth();
int dispHeight = dispWidth * 3 / 4;

// 元のサイズでBitmap作成
bmp = Bitmap.createBitmap(bmp, 0, 0, dispWidth, dispHeight, null, true);

// デバイスの画面サイズを取得
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);

// スケールさせたい大きさを指定
int scaleWidth = size.x / 2;
int scaleHeight = scaleWidth * 3 / 4;

// 上で指定した大きさにする為にLayoutParamsを指定
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(scaleWidth, scaleHeight);

// 指定したparamsをセットしてokomeThumbViewにBitmap表示
okomeThumbView.setLayoutParams(params);
okomeThumbView.setImageBitmap(bmp);

BitmapクラスにはcreateScaledBitmapというメソッドも存在するのですが、
機種によって勝手にトリミングされたりして思ったようにサムネイルが取得出来ない場合がありました。

また、最初からscaleWidthscaleHeightcreateBitmapを実行すると、
今回の場合はscaleWidthをデバイスの画面サイズから作っている為、
元のbmp.widthがscaleWidthよりも小さい場合にエラーが起こります。(これも機種に依存するエラーです。)

それにしても圧倒的javaアレルギーだった私ですが、androidを始めてからjavaアレルギーがなくなった気がします。
個人的にはiOSよりもandroidの方が自由度が高いので開発は楽しかったかなーという感想です。
android studioxcodeがもっと仲良くなって同じ仕様になってくれたら嬉しいですねww (ショートカットとか)