2

Androidで画像を読み込みたいのですが、画像が大きすぎる場合は、読み込むにサイズを変更したいと思います。BitmapFactoryを使用して画像のサイズだけを取得し、次に適切なスケーリング係数を計算し、BitmapFactoryを使用して必要なサイズの画像を読み込むことができることを学びました(この関連スレッドで見つけた非常に有能な提案に従って) 。

それで私はそれを試みました、そしてそれは働くことを拒否しました。私はこの1時間、コードを調べて、このような単純な操作がまったく効果がない理由を理解しようとしました(スケーリング係数は完全に無視されていました!)

それから私はAndroidの問題3072に出くわしました...これは2年以上もの間GIFファイルで壊れていると識別されていることがわかりました。GIFは完全に最新ではないことはわかっていますが、まだ存在し、広く使用されています(私のテストセットには多くのGIFが含まれているため、バグレポートが見つかるまでは一律に壊れているように見えました)。

私の質問は、スケーリング係数が使用されている場合にGIFファイルを黙って無視せずに正しく読み取り、サイズ変更するBitmapFactoryの代わりに何を使用できるかということです。メモリの制約により、大きな画像を直接ロードしてさらに処理することはできないため、これはストリーミングソリューションである必要があります。

私の他の質問は、このような古い未修正のバグに遭遇し、それを認識していないか、さらに悪いことに、APIに依存して要求された機能を正確に実行し、メモリリークやその他の奇妙な驚きをもたらす人がどれほどいるかということです。

4

1 に答える 1

2

ここに掲載されているソリューションを使用することになりました。

options.inSampleSize = 2;
bitmap = BitmapFactory.decodeStream(new URL(url).openStream(),null, options);
Bitmap scaledBitmap = scaleDown(bitmap, 1280, true);
bitmap = scaledBitmap;

どこscaleDownにありますか:

public static Bitmap scaleDown(Bitmap realImage, float maxImageSize,
                               boolean filter) {
    float ratio = Math.min(
                (float) maxImageSize / realImage.getWidth(),
                (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
                height, filter);
    return newBitmap;
}
于 2013-03-29T09:42:23.327 に答える