2

アバターをグリッド アイテムに追加する必要があります。

電話ギャラリーから選択した画像のサイズ変更を処理する方法を知りたいです。選択したら、グリッドに合わせるためにサイズ変更が必要になると思います。

ただし、画面密度ごとにサイズ変更された画像を保存する必要がありますか。1 つの xhdpi バージョンを保存し、他のデバイス用にスケールダウンするか、他の方法で賢くしますか?

その理由は、アプリがこのイメージをクラウド データベースに保存し、他のユーザーがこのイメージをダウンロードできるようにするためです。さまざまなデバイスで画像が表示される場合があります (したがって、さまざまな画像サイズが必要になります)。この画像の管理はどのように処理する必要がありますか?

4

4 に答える 4

4

次のようにします。

 DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    Bitmap bitmapOrg = new BitmapDrawable(getResources(), new  ByteArrayInputStream(imageThumbnail)).getBitmap();

    int width = bitmapOrg.getWidth();
    int height = bitmapOrg.getHeight();

    float scaleWidth = metrics.scaledDensity;
    float scaleHeight = metrics.scaledDensity;

    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);

    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);
于 2013-04-26T06:48:37.860 に答える
2

以下のコードがお役に立てば幸いです。最小限のオーバーヘッドで必要なサイズの画像を返します。私はこれを何度も使用しましたが、魅力のように機能します。ターゲットデバイスに応じて必要な寸法を設定できます。スケーリングすると画像がぼやけますが、そうではありません。

private Bitmap getBitmap(Uri uri) {                             
    InputStream in = null;
    try {
        final int IMAGE_MAX_SIZE = 200000; // 0.2MP
        in = my_context.getContentResolver().openInputStream(uri);

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;                    //request only the dimesion
        BitmapFactory.decodeStream(in, null, o);
        in.close();

        int scale = 1;
        while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) > IMAGE_MAX_SIZE) {
            scale++;
        }

        Bitmap b = null;
        in = my_context.getContentResolver().openInputStream(uri);
        if (scale > 1) {
            scale--;
            // scale to max possible inSampleSize that still yields an image
            // larger than target
            o = new BitmapFactory.Options();
            o.inSampleSize = scale;
            b = BitmapFactory.decodeStream(in, null, o);
            // resize to desired dimensions
            int height = b.getHeight();
            int width = b.getWidth();

            double y = Math.sqrt(IMAGE_MAX_SIZE
                    / (((double) width) / height));
            double x = (y / height) * width;

            Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x, (int) y, true);
            b.recycle();
            b = scaledBitmap;
            System.gc();
        } else {
            b = BitmapFactory.decodeStream(in);
        }
        in.close();

        return b;
    } catch (IOException e) {

        return null;
    }

}
于 2012-12-01T13:13:02.040 に答える
1
android:scaleType="fitXY"
android:layout_gravity="center"

画像を拡大縮小して中央に配置し、コンテナの Size を fill_parent に合わせます。

于 2012-12-01T13:13:12.373 に答える
0

画像をドローアブル (xhdpi、hdpi、mdpi、ldpi などを作成せずに) に配置できます (グローバル画像)。

次に、異なる画面サイズに対して 4 つの同じレイアウトを作成できます。すべてのレイアウトで、ドローアブル ディレクターの画像を使用できます。そのため、画像のサイズを簡単に変更できます。

于 2012-12-01T13:14:46.363 に答える