0

ストレージから画像を取得し、そのアプリケーションの画像サイズに配置して、見栄えがするようにするアプリケーションを作成しようとしています。

4

1 に答える 1

1

メモリからビットマップをスケーリングすると、メモリを大量に消費する可能性があります。古いデバイスでアプリがクラッシュするのを避けるために、これを行うことをお勧めします。

これら 2 つの方法を使用して、ビットマップを読み込み、縮小します。私はそれらを2つの機能に分けました。createLightweightScaledBitmapFromStream()を使用options.inSampleSizeして、必要な寸法への大まかなスケーリングを実行します。次に、createScaledBitmapFromStream()より多くのメモリを使用してBitmap.createScaledBitmap()、イメージを目的の解像度にスケーリングします。

電話createScaledBitmapFromStream()すれば準備完了です。

軽量スケーリング

public static Bitmap createLightweightScaledBitmapFromStream(InputStream is, int minShrunkWidth, int minShrunkHeight, Bitmap.Config config) {

  BufferedInputStream bis = new BufferedInputStream(is, 32 * 1024);
  try {
    BitmapFactory.Options options = new BitmapFactory.Options();
    if (config != null) {
      options.inPreferredConfig = config;
    }

    final BitmapFactory.Options decodeBoundsOptions = new BitmapFactory.Options();
    decodeBoundsOptions.inJustDecodeBounds = true;
    bis.mark(Integer.MAX_VALUE);
    BitmapFactory.decodeStream(bis, null, decodeBoundsOptions);
    bis.reset();

    final int width = decodeBoundsOptions.outWidth;
    final int height = decodeBoundsOptions.outHeight;
    Log.v("Original bitmap dimensions: %d x %d", width, height);
    int sampleRatio = Math.max(width / minShrunkWidth, height / minShrunkHeight);
    if (sampleRatio >= 2) {
      options.inSampleSize = sampleRatio;
    }
    Log.v("Bitmap sample size = %d", options.inSampleSize);

    Bitmap ret = BitmapFactory.decodeStream(bis, null, options);
    Log.d("Sampled bitmap size = %d X %d", options.outWidth, options.outHeight);
    return ret;
  } catch (IOException e) {
    Log.e("Error resizing bitmap from InputStream.", e);
  } finally {
    Util.ensureClosed(bis);
  }
  return null;
}

最終スケーリング (最初に軽量スケーリングを呼び出します)

public static Bitmap createScaledBitmapFromStream(InputStream is, int maxWidth, int maxHeight, Bitmap.Config config) {

  // Start by grabbing the bitmap from file, sampling down a little first if the image is huge.
  Bitmap tempBitmap = createLightweightScaledBitmapFromStream(is, maxWidth, maxHeight, config);

  Bitmap outBitmap = tempBitmap;
  int width = tempBitmap.getWidth();
  int height = tempBitmap.getHeight();

  // Find the greatest ration difference, as this is what we will shrink both sides to.
  float ratio = calculateBitmapScaleFactor(width, height, maxWidth, maxHeight);
  if (ratio < 1.0f) { // Don't blow up small images, only shrink bigger ones.
    int newWidth = (int) (ratio * width);
    int newHeight = (int) (ratio * height);
    Log.v("Scaling image further down to %d x %d", newWidth, newHeight);
    outBitmap = Bitmap.createScaledBitmap(tempBitmap, newWidth, newHeight, true);
    Log.d("Final bitmap dimensions: %d x %d", outBitmap.getWidth(), outBitmap.getHeight());
    tempBitmap.recycle();
  }
  return outBitmap;
}
于 2013-09-04T09:09:51.517 に答える