把大图片加载进内存

Posted zhongyinghe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把大图片加载进内存相关的知识,希望对你有一定的参考价值。

把图片加载进内存,要对图片进行缩放,否则内存溢出

代码:

 1 package com.example.loadimage;
 2 
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.graphics.Bitmap;
 6 import android.graphics.BitmapFactory;
 7 import android.graphics.BitmapFactory.Options;
 8 import android.graphics.Point;
 9 import android.view.Menu;
10 import android.view.View;
11 import android.view.WindowManager;
12 import android.widget.ImageView;
13 
14 public class MainActivity extends Activity {
15 
16     private int windowHeight;
17     private int windowWidth;
18     private ImageView iv;
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23         iv = (ImageView) findViewById(R.id.iv);
24         
25         WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
26         windowHeight = wm.getDefaultDisplay().getHeight();
27         windowWidth = wm.getDefaultDisplay().getWidth();
28         
29         //3.0以后版本的使用方法
30        /* Point outSize = new Point();
31         wm.getDefaultDisplay().getSize(outSize);
32         windowWidth = outSize.x;
33         windowHeight = outSize.y;*/
34         
35     }
36     
37     public void load(View view){
38         //下面两行注释代码,如果图片过大,则内存会溢出
39         //Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/33.jpg");
40         //iv.setImageBitmap(bitmap);
41         //图片解析配置
42         BitmapFactory.Options opts = new Options();
43         //这个设置是为了不去解析图片,即不把图片加进内存中,而是返回图片的头部信息
44         opts.inJustDecodeBounds = true;
45         BitmapFactory.decodeFile("/sdcard/aa.jpg", opts);
46         //图片的真实高度和宽度
47         int imageWidth = opts.outWidth;
48         int imageHeight = opts.outHeight;
49         System.out.println("宽为:" + imageWidth);
50         System.out.println("高为:" + imageHeight);
51         
52         //计算缩放比例
53         int scaleX = imageWidth / windowWidth;
54         int scaleY = imageHeight / windowHeight;
55         int scale = 1;
56         if(scaleX > scaleY & scaleY >= 1){
57             scale = scaleX;
58         }
59         
60         if(scaleY > scaleX & scaleX >= 1){
61             scale = scaleY;
62         }
63         //真的去解析图片
64         opts.inJustDecodeBounds = false;
65         
66         //采样率
67         opts.inSampleSize = scale;
68         Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/aa.jpg", opts);
69         iv.setImageBitmap(bitmap);
70     }
71     
72 }

 

以上是关于把大图片加载进内存的主要内容,如果未能解决你的问题,请参考以下文章

Android App内存优化之图片优化

从类加载进内存到对象创建,各部分的执行顺序

iOS开发之性能优化

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

如何解决在iOS中高效的加载图片问题?

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题