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

android OS & iPadOS の記録。

基礎。画像Fileパスから、BitmapDrawable作成。

2022-04-23 02:03:13 | Android studio 日記

消費メモリ見直しで一枚の画像を表示させるメソッドを確認。

タブレット横置き固定でスクリーンに大きさを合わせる。
ポートレート画像は左90度回転させる。
ランドスケープ画像はそのまま表示。


getContext()は、contextを取得するメソッド。自前で作る。
Bitmap.createBitmap()のmatrix の設定で元画像の大きさ、回転を一度で加工する。

    mBitmap = Bitmap.createBitmap( mBitmap, 0, 0, Width, Height, matrix, true );

myMessage(string) はダイアログで自前で用意。

 

    public BitmapDrawable setImage( File f ) { // jpg か png チェック済みであること。

        if ( f == null || !f.exists() || !f.isFile() )
            return null;

        Bitmap mBitmap;
        BitmapDrawable drawable = null;
        BitmapFactory.Options BFop = new BitmapFactory.Options();
        Matrix matrix = new Matrix();
        float mag;
        int w, h;

        try {

            BFop.inJustDecodeBounds = true; // 実態は読み込まない

            InputStream istream = new FileInputStream( f );
            mBitmap = BitmapFactory.decodeStream( istream, null, BFop );
            istream.close();
            mBitmap = null;

            if ( getImageShape( BFop.outWidth, BFop.outHeight ) == Configuration.ORIENTATION_PORTRAIT ) {
                // ポートレート画像
                w = BFop.outHeight; // 回転を踏まえ縦横サイズ入れ替え
                h = BFop.outWidth;
                matrix.postRotate(270.00f ); // 左90度回転設定
            } else {
                // ランドスケープ画像
                w = BFop.outWidth;
                h = BFop.outHeight;
            }

            // 元画像が極度に大きい場合はある程度縮小。消費メモリ削減。
            BFop.inSampleSize = calculateInSampleSize( BFop, w, h );

            mag = calcImageViewFit( BFop, w, h ); // スクリーンに填め込むため倍率を取得
            matrix.postScale( mag, mag );

            BFop.inJustDecodeBounds = false; // 実態を読み込む
            istream = new FileInputStream( f ); // ストリームリセット

/*
            mBitmap = BitmapFactory.decodeStream( istream, null, BFop );
            if ( mBitmap != null )
                mBitmap = Bitmap.createBitmap( mBitmap, 0, 0, BFop.outWidth, BFop.outHeight, matrix, true );
            エラーチェックを入れたい場合は分ける。catch で受け取るのでまとめた。
*/

            mBitmap = Bitmap.createBitmap(
                    BitmapFactory.decodeStream( istream, null, BFop ),
                    0, 0, BFop.outWidth, BFop.outHeight, matrix, true
            );

            istream.close();
            drawable = new BitmapDrawable( getContext().getResources(), mBitmap );

        } catch ( IOException ioe ) {
            myMessage( getContext().getResources().getString( R.string.error_io_exception ) );
            return null;
        } catch ( OutOfMemoryError ome ) {
            myMessage( getContext().getResources().getString( R.string.error_out_of_memory ) );
            return null;
        } catch ( Exception e ) {
            return null;
        }
        mBitmap = null;
        return drawable;
    }

    public float calcImageViewFit( BitmapFactory.Options BFop, int imageWidth, int imageHeight ) {

        int displayWidth = getScreenWidth(); // スクリーンサイズ取得は別途参照
        int displayHeight = getScreenHeight();
        float fX = (float) displayWidth / (float) ( imageWidth / BFop.inSampleSize );
        float fY = (float) displayHeight / (float) ( imageHeight / BFop.inSampleSize );
        float ret = 1f;

        if ( ( ( imageWidth >= displayWidth) && ( imageHeight >= displayHeight ) )
                || ( ( imageWidth <= displayWidth ) && ( imageHeight <= displayHeight ) ) ) {
            ret = Math.min(fX, fY);
        } else if ( imageWidth > displayWidth )
            ret = fX;
        else
            ret = fY;

        return ret;
    }

    private int calculateInSampleSize(BitmapFactory.Options op, int reqW, int reqH ) {
        int height = op.outHeight;
        int width = op.outWidth;
        int inSamplSize = 1;

        if ( height > reqH || width > reqW) {
            int halfHeight = height / 2;
            int halfWidth = width / 2;

            while ( ( halfHeight / inSamplSize ) >= reqH &&
                    ( halfWidth / inSamplSize ) >= reqW
            ) {
                inSamplSize *= 2;
            }
        }
        return inSamplSize;
    }

    public int getImageShape(int x, int y) {
        int ret = Configuration.ORIENTATION_PORTRAIT;
        if (x > y) ret = Configuration.ORIENTATION_LANDSCAPE;
        return ret;
    }

 


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

開発環境を改善の為にノートPCに変更。色々疲れた。

2022-04-22 01:38:49 | Android studio 日記

数年前にpc故障で、タブレットWin10PCで一般作業を継続。
最近、予算ができたので中堅ノートPCに作業環境を変更した。

DELL、AMD6コア、キャンペーン中で送料込み6万5千円。
Win11 なのでどうしても6コアモデルが欲しかった。
そして、1920ⅹ1200ドット、14インチ。お買い得でした。

新たにインストールしたが、android studio 2021.1.1…?
バージョンが西暦になってる^^;
ビルダーバージョンは、6.5 => 7.2。これはわかるけど。

さっそく、プロジェクトフォルダーを丸ごとコピー。
以前、プロジェクト名変更とか複製とかやった延長でいじってたら赤字パレード;;

インポートも整合とれず、お手上げ。
じゃあ、新規プロジェクト作って、コードをコピペ。

微妙に上手くいかず、10日ほどすったもんだ。
もう一度、最初からと思い、以前のプロジェクトをもう一度丸ごとコピー。
開いて観察しているとバルーンヘルプにビルダーアップグレード云々。
英語だし、意味が分からないけど取り合えずクリック。

いやいやいや。上手く変換してくれたわ^^;
赤字対応はなんだったんだ。

 

ストレージ容量も増えたので、エミュレータOSもたくさん入れてみた。
今までOS4.2 でチェックしてたから気が付かなかったけど、
ファイルアクセスが、頻繁に変わっていた模様。
これ、OS毎に分けて対応が面倒くさい。

Pictureとか特定フォルダーに限定してしまおう。
removableもテスト次第で組み込み。

 


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする