0

我正在制作一个 Android 游戏,但是当我加载我的位图时,我得到一个内存错误。我知道这是由非常大的位图(它是游戏背景)引起的,但我不知道如何才能避免出现“位图大小扩展 VM 预算”错误。我无法重新缩放位图以使其更小,因为我无法使背景更小。有什么建议么?

哦,是的,这是导致错误的代码:

space = BitmapFactory.decodeResource(context.getResources(),
            R.drawable.background);
    space = Bitmap.createScaledBitmap(space,
            (int) (space.getWidth() * widthRatio),
            (int) (space.getHeight() * heightRatio), false);
4

3 回答 3

0

您将不得不对图像进行采样。显然,您不能将其“缩放”到小于屏幕,但是对于小屏幕等,它不必像大屏幕那样具有高分辨率。

长话短说,您必须使用 inSampleSize 选项进行下采样。如果图像适合屏幕,实际上应该很容易:

    final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    final Display display = wm.getDefaultDisplay();

    final int dimension = Math.max(display.getHeight(), display.getWidth());

    final Options opt = new BitmapFactory.Options();
    opt.inJustDecodeBounds = true;

    InputStream bitmapStream = /* input stream for bitmap */;
    BitmapFactory.decodeStream(bitmapStream, null, opt);
    try
    {
        bitmapStream.close();
    }
    catch (final IOException e)
    {
        // ignore
    }

    final int imageHeight = opt.outHeight;
    final int imageWidth = opt.outWidth;

    int exactSampleSize = 1;
    if (imageHeight > dimension || imageWidth > dimension)
    {
        if (imageWidth > imageHeight)
        {
            exactSampleSize = Math.round((float) imageHeight / (float) dimension);
        }
        else
        {
            exactSampleSize = Math.round((float) imageWidth / (float) dimension);
        }
    }

    opt.inSampleSize = exactSampleSize; // if you find a nearest power of 2, the sampling will be more efficient... on the other hand math is hard.
    opt.inJustDecodeBounds = false;

    bitmapStream = /* new input stream for bitmap, make sure not to re-use the stream from above or this won't work */;
    final Bitmap img = BitmapFactory.decodeStream(bitmapStream, null, opt);

    /* Now go clean up your open streams... : ) */

希望有帮助。

于 2012-09-01T02:58:25.063 回答
0

这可能会对您有所帮助:http: //developer.android.com/training/displaying-bitmaps/index.html

来自 Android 开发者网站,关于如何有效显示位图 + 其他内容的教程。=]

于 2012-09-01T04:13:26.340 回答
0
  • 我不明白你为什么要使用ImageBitmap?为背景。如果有必要,没关系。否则请使用Layout并设置其背景,因为您使用的是背景图像。这个很重要。(检查 Android 文档。他们已经明确指出了这个问题。)

您可以通过以下方式执行此操作

 Drawable d = getResources().getDrawable(R.drawable.your_background);
 backgroundRelativeLayout.setBackgroundDrawable(d);
于 2012-09-01T05:15:36.897 回答