検索で個々の処理説明はあるけど、連携の説明は無く Bitmap で拡大縮小、次に回転の2工程にしていた。
デベロッパーで Matrix にスケールの設定、角度の設定がある。
それを Bitmap の加工に使う。デベロッパーの説明はよく分からない。仕方ないので実験。
matrix.postScale( w倍率, h倍率 );
Bitmap加工
matrix.postRotate( 角度 );
Bitmap加工
分からないから、これで取り合えずやってみた。
90度回転はOK。
スクリーンサイズに合わせたはずが1/2に…。
スケールが2回処理された?。ということは。
matrix.postScale( w倍率, h倍率 );
matrix.postRotate( 角度 );
Bitmap加工
思い通りの結果が出た。一度で加工が完了。気持ち処理時間が短いかな?
今回の縛りは、スクリーン横長固定。画像は縦長。90度回転でスクリーンサイズにフィットさせる時。
public void fitImage( ImageView view, Bitmap bm ) { // ポートレートBitmap only
Bitmap tempBitmap = null;
Matrix matrix = new Matrix();
float mag = calcImageViewFit( bm.getHeight(), bm.getWidth() ); // 回転を踏まえ縦横サイズ入れ替えて倍率取得
matrix.postScale( mag, mag );
matrix.postRotate(270.00f );
tempBitmap = Bitmap.createBitmap( bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
view.setImageBitmap( tempBitmap );
}
public float calcImageViewFit(int bw, int bh) {
int screenWidth = getScreenWidth(); // スクリーンサイズ取得メソッド各自用意
int screenHeight = getScreenHeight(); // スクリーンサイズ取得メソッド各自用意
float fX = (float) screenWidth / (float) bw;
float fY = (float) screenHeight / (float) bh;
float ret = 1f;
if (((bw > screenWidth) && (bh > screenHeight))
|| ((bw < screenWidth) && (bh < screenHeight))) {
ret = Math.min(fX, fY);
} else if ((bw > screenWidth) && (bh < screenHeight)) {
ret = fX;
} else if ((bw < screenWidth) && (bh > screenHeight)) {
ret = fY;
}
return ret;
}
スケールの倍率は、回転させたときに画像の横がスクリーンの縦になる事に注意。
縦横を対応させて倍率を取得する。
元画像サイズで表示させる場合は特に手を加える部分は無い。フィットや回転は加工前の準備で処理時間を短縮できる。
例えば、回転とフィット。元画像を回転してスクリーンに合わせるか。スクリーンに合わせてから回転か。
スクリーンより大きい画像は、スクリーンに合わせて縮小し、回転。
小さい画像は、回転してからスクリーンに合わせる。
細かく考えるのが面倒なら、Matrix で同時加工ですわ。