2

カスタムサイズで画像のサイズを変更する必要があります。画像はデバイスのカメラまたはギャラリーから取得されたもので、以下のコードに疲れましたが、画像が引き伸ばされています。引き伸ばされていない正方形の画像が必要です。

public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
boundBoxInDp=300;
        int height = bm.getHeight();
        int width = bm.getWidth();
        float scaleWidth = ((float) boundBoxInDp) / width;
        float scaleHeight = ((float) boundBoxInDp) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
                matrix, false);
        return resizedBitmap;

    }
4

3 に答える 3

1

これは、バウンディング ボックスにイメージが収まりません (その失敗は、おそらく「ストレッチ」と呼ばれるものです)。正方形のバウンディング ボックス内の長方形のビットマップは処理されません。また、バウンディング ボックスより小さい画像も特に適切に処理されません。おそらく次のようなものが必要です。

public Bitmap decodeSampledBitmapFromFile(Bitmap bm, int boundBoxInDp) {
    boundSquareInPx=convertToPixels(300);
    int maxDimen = Math.max(bm.getHeight(), bm.getWidth())
    float scale = (maxDimen <= boundSquareInPx) ? 1 : boundSquareInPx / (float) maxDimen;
    float scaleWidth = scale * bm.getWidth();
    float scaleHeight = scale * bm.getHeight();
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
            matrix, true);
    return resizedBitmap;

}

いくつかのメモ: 画像が境界よりも小さい場合、それは収まりません-明らかな変更でそれが行われます。

次に、dp != px; オブジェクトは px を返すため、Bitmapdp から px に変換する必要があります (これは他の場所で十分に文書化されています)。

postTranslate(...)対応してトリミングされたビットマップを中央に配置する必要がある場合に使用します。

ドキュメントはこちらです。これ、私が知っている Android でのサイズ変更用の最高のライブラリです。他に必要なものはありませんでした。しばらくゲームに参加していて、これを頻繁に使用しています。

私の意見では、API を効率的に操作するための最適な入門書が必要な場合は、ソース コードをImageViewDrawableインスタンスに読み込んでください。本当に価値のある個人的な開発演習は、SDK を使用して、中央が切り取られたフェード トランジション ドローアブルを実装することです。これは、Android ライブラリに欠けている唯一のものの 1 つであり、非常に多くの種類の作業が必要になるためです。上記で行おうとしているコーディング。

注意:

お気づきのように、別の回答者が の存在を指摘していますがcreateScaledBitmap、これはおそらくはるかに明確なコードです。あなたがしていることは基本的にどのように正しく、どのように改善できるかを指摘したかっただけです。

一番。

于 2013-09-03T13:45:42.137 に答える