15

次の問題の解決策を探しています: a のサイズをBitmap固定サイズ (512x128 など) に変更する方法。ビットマップ コンテンツの縦横比を維持する必要があります。

私はそれが次のようなものであるべきだと思います:

  • 空の 512x128 ビットマップを作成する

  • 縦横比を維持したまま、元のビットマップを縮小して 512x128 ピクセルに合わせます

  • スケーリングされたものを空のビットマップにコピーします(中央揃え)

これを達成する最も簡単な方法は何ですか?

これはすべてGridView、画像のアスペクト比が他の画像と異なるとレイアウトが乱れるためです。スクリーンショットを次に示します (最後の画像を除くすべての画像のアスペクト比は 4:1 です)。

スクリーンショット

4

5 に答える 5

40

これを試して、比率を計算してから再スケーリングしてください。

private Bitmap scaleBitmap(Bitmap bm) {
    int width = bm.getWidth();
    int height = bm.getHeight();

    Log.v("Pictures", "Width and height are " + width + "--" + height);

    if (width > height) {
        // landscape
        float ratio = (float) width / maxWidth;
        width = maxWidth;
        height = (int)(height / ratio);
    } else if (height > width) {
        // portrait
        float ratio = (float) height / maxHeight;
        height = maxHeight;
        width = (int)(width / ratio);
    } else {
        // square
        height = maxHeight;
        width = maxWidth;
    }

    Log.v("Pictures", "after scaling Width and height are " + width + "--" + height);

    bm = Bitmap.createScaledBitmap(bm, width, height, true);
    return bm;
}
于 2014-04-05T15:29:31.610 に答える
22

Coen Damen の回答は、常に Max Height と Max Width を尊重するとは限りません。答えは次のとおりです。

 private static Bitmap resize(Bitmap image, int maxWidth, int maxHeight) {
    if (maxHeight > 0 && maxWidth > 0) {
        int width = image.getWidth();
        int height = image.getHeight();
        float ratioBitmap = (float) width / (float) height;
        float ratioMax = (float) maxWidth / (float) maxHeight;

        int finalWidth = maxWidth;
        int finalHeight = maxHeight;
        if (ratioMax > 1) {
            finalWidth = (int) ((float)maxHeight * ratioBitmap);
        } else {
            finalHeight = (int) ((float)maxWidth / ratioBitmap);
        }
        image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);
        return image;
    } else {
        return image;
    }
}
于 2015-02-06T13:32:18.103 に答える
1

https://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap, int, int, boolean)

と の両方がdstWidthdstHeightから取得されsrc.getWidth()*scaleていることを確認しますsrc.getHeight()*scale。ここで、scaleは、スケーリングされたビットマップが 512x128 内に収まるように決定する必要がある値です。

于 2013-02-27T23:02:32.980 に答える