如何缩放图像或调整大小以避免内存不足错误?

时间:2016-06-16 06:53:34

标签: java android image bitmap

我是开发新手,我现在已经尝试制作一个简单的游戏了一段时间,而且我无法使其正常工作,因为它不断出现内存问题在大多数设备上。

我尽可能地缩小了图像尺寸,最大的图像是117kB。

我的图片存储在一个可绘制的文件夹中。我不认为我的图像需要单独使用xxhdpi或xhdpi。所以在清单中我已经提到了所有支持屏幕尺寸代码。

我在清单中尝试了以下内容,但它没有帮助。

    android:largeheap = "true"
    android:noHistory = "true" (for every activity so that it doesn't stack up over each other)

我有大约50个活动(所有活动都有不同的格式,所以不能只做一个活动),这些活动是从一个普通的应用程序类中随机生成的。

我的Q1.java

    public class Q1 extends Activity {
    TextView textview;
    int score;
     MediaPlayer player;
   TextView scored;
   LinearLayout imageview3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,   WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_q1);


    scored = (TextView) findViewById(R.id.score);
    imageview3 = (LinearLayout) findViewById(R.id.scoreview);
    Intent mintent = getIntent();
    score = mintent.getIntExtra("score", 0);
    scored.setText(String.valueOf(score));


    TextView scrolltext=(TextView) findViewById(R.id.scrolltext);
    Typeface custom_font = Typeface.createFromAsset(getAssets(), "fonts/panicStricken.ttf");

    scrolltext.setTypeface(custom_font);

}

public void button(View view) {
    player = MediaPlayer.create(Q1.this, R.raw.correct);

    player.setVolume(50,50);
    player.start();

    Class activityToShow = ActivityList.getInstance().getRandomActivity();

    Intent intent = new Intent(this,activityToShow );
    intent.putExtra("score", score);

    startActivity(intent);


}

public void fedex(View view) {
    player = MediaPlayer.create(Q1.this, R.raw.wrong);

    player.setVolume(50,50);
    player.start();
    score = score - 1;
    scored.setText(String.valueOf(score));
    if (score == 0) {
        Intent intent = new Intent(this, GameOver.class);
        startActivity(intent);
    }
}
@Override
public void onBackPressed() {



    Intent intent = new Intent(this,MainMenu.class);

    startActivity(intent);

    super.onBackPressed();
    finish();
}

我的layout_q1 xml

      <ImageView
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/scoreview"
    android:background="@drawable/pic"
    android:onClick="pic"
    android:layout_marginTop="50dp"
    android:id="@+id/imageView11" />

我知道有一篇关于loading large bitmaps efficiently的文章 但是我在编程方面并不是那么出色,而且我将代码应用到我自己的应用程序中仍然有点棘手。

有人可以用我最好的方式帮助我吗?

我不认为我可以进一步减小图像的大小。我能做的最好的事情就是将所有图像尺寸保持在平均50kB,即50张50kB的图像。

当android加载所有这些图像时,我的尺寸减小是否足以阻止这种内存噩梦?

2 个答案:

答案 0 :(得分:0)

避免内存不足错误使用BitmapFactory.Options类减少图像像素大小然后压缩图像如下所示

       BitmapFactory.Options options = new BitmapFactory.Options();
       options.inSampleSize = 3;
       Bitmap bmp = BitmapFactory.decodeFile(filePath, options);
       ByteArrayOutputStream stream = new ByteArrayOutputStream();
       bmp.compress(Bitmap.CompressFormat.JPEG, 85, stream);
       imageView.setImageBitmap(bmp);

答案 1 :(得分:0)

真正的问题发生在图像大小调整上。仅仅调整图像大小一次或仅调整一次图像并不是真的令人担忧,但是当您经常这样做时,您肯定会立刻遇到OOM错误。克服这个问题的策略是通过缓存。当您缓存图像时,它将保证您只需要以较少的时间/步骤调整大小。

这是一个通过流程图的视觉用例。 enter image description here

上面的流程图显示了处理此案例的正确方法。我们有一个抽象的Cache来存储上一个图像(注意:缓存是您的个人偏好,它可以是任何类似:内存缓存,数据库缓存或文件缓存。也可以阅读LRU cache - Least Recently used Algorithm )。