0

URLから画像を取得して、drawableに変換したい。私はこの方法を持っていますが、うまくいきます:

public static Drawable getDrawableFromUrl(String url) throws IOException {
    Bitmap x;

    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
    connection.connect();
    InputStream input = connection.getInputStream();

    x = BitmapFactory.decodeStream(input);
    return new BitmapDrawable(x);
}

1つのことを除いて。画像が大きすぎるとアプリがクラッシュします。

E/dalvikvm-heap(12750): 13142360-byte external allocation too large for this process.
E/dalvikvm(12750): Out of memory: Heap Size=6023KB, Allocated=3177KB, Bitmap Size=2563KB, Limit=20480KB
E/dalvikvm(12750): Trim info: Footprint=6023KB, Allowed Footprint=6023KB, Trimmed=952KB
E/GraphicsJNI(12750): VM won't let us allocate 13142360 bytes

画像に必要なメモリをどうにかして増やすことはできますか? それとも、この問題を回避する方法がありますか?

4

4 に答える 4

2

大きなビットマップを効率的にロードする

上記のリンクは、URL からサイズ変更されたビットマップを返します。次に、ビットマップ ドローアブルに変換できます。

そのリンクから Bitmap fun サンプル アプリケーションをダウンロードして使用します。

于 2012-11-16T10:49:17.783 に答える
1

このリンクが示唆するように、画像を縮小またはサイズ変更する必要があります

大きな画像を読み込んでいます

このためのコードスニペットは次のとおりです。

    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {
    if (width > height) {
        inSampleSize = Math.round((float)height / (float)reqHeight);
    } else {
        inSampleSize = Math.round((float)width / (float)reqWidth);
    }
}
return inSampleSize;
}

ドローアブルを設定するときにこの部分を呼び出すだけです

MyImageview.setImageBitmap(decodeSampledBitmapFromResource(getResources(), mydrawable, 420, 620));
于 2012-11-16T11:01:52.743 に答える
1

Ok。最終的に動作するコードは次のとおりです。提案されたように、特定の関数を使用して画像のサイズを縮小しました: calculateInSampleSize - thx Androyds.

public static Drawable getDrawableFromUrl(String url, Context context) throws IOException {
    Bitmap x;

    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
    connection.connect();
    InputStream inputStream = connection.getInputStream();
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

    BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
bufferedInputStream.mark(connection.getContentLength());
BitmapFactory.decodeStream(bufferedInputStream, null, options);
bufferedInputStream.reset();

options.inJustDecodeBounds = false;
options.inSampleSize = calculateInSampleSize(options, 400, 400);

x = BitmapFactory.decodeStream(bufferedInputStream, null, options);

bufferedInputStream.close();
connection.disconnect();

    BitmapDrawable y = new BitmapDrawable(x);

    return y;
}
于 2012-11-19T11:06:31.010 に答える
0

ファイルを一時的に電話に保存し、それを読んで描画可能ファイルとして使用することをお勧めします。ただし、電話機が画像を読み込めない場合は、送信者からの画像を縮小するか、画像を開く前に縮小する必要があります。

于 2012-11-16T10:45:05.140 に答える