タブレット用プログラムの書き止め

android OS & iPadOS の記録。

基礎。Bitmap と Matrix で拡大縮小と回転を一度に処理をする。

2021-12-30 02:51:26 | Android studio 日記

検索で個々の処理説明はあるけど、連携の説明は無く 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 で同時加工ですわ。