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

Java 如何缩放图像或调整大小以避免内存不足错误?,java,android,image,bitmap,Java,Android,Image,Bitmap,我是开发新手,我已经尝试制作一个简单的游戏有一段时间了,但我无法使它正常工作,因为它在大多数设备上不断出现内存不足的问题 我尽可能地缩小了图像大小,我的最大图像是117kB 我的图像存储在一个可绘制的文件夹中。我不认为我的图像需要单独使用xxhdpi或xhdpi。所以在清单中我提到了所有支持屏幕大小的代码 我在舱单上尝试了以下方法,但没有效果 android:largeheap = "true" android:noHistory = "true" (for every acti

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

我尽可能地缩小了图像大小,我的最大图像是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();
}
我的布局与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" />

我知道有篇文章是关于 但我不太擅长编程,而且对我来说,将代码应用到自己的应用程序中仍然有点棘手

有人能帮我找到最好的方法吗

我认为我无法进一步缩小图像的大小。我能做的最好的可能就是将所有图像的大小保持在平均50kB,也就是说大约50个50kB的图像


当android将所有这些图像加载到一起时,我的大小缩减是否足以阻止这场内存不足的噩梦?

为避免内存不足错误,请使用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);

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

下面是一个可视化的用例流程图。


上面的流程图显示了处理此案例的正确方法。我们有一个抽象的
缓存
,用于存储以前的图像(注意:缓存是您个人的首选,它可以是任何类型:内存缓存、数据库缓存或文件缓存。也可以随意阅读)。

还有一个关于如何高效加载图像/缩略图而不会将质量降低太多的问题。可能值得一试。问题是我不知道如何将位图工厂代码应用到我的游戏中……比如我如何分配一个图像以在每个活动中可伸缩?嘿……你的方法似乎是一个不错的选择,但我的问题是如何将其应用到我的代码中,因为我是一个初学者……如果你能告诉我如何将其应用到活动。。。漂亮吗?如果你能遵循我建议的算法,下次你会更容易。基本上,我的解决方案的整个想法是缓存大小调整后的图像,这样下次如果你再次需要该图像,你就不再需要调整它的大小,因为你的缓存中有一个大小调整后的图像的副本。(调整大小是OOM的罪魁祸首之一)顺便说一句,我也是Android的新手。如果您有个人问题,可以在我的个人资料中找到我的联系人。干杯