前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 多媒体开发学习之加载大图片

Android 多媒体开发学习之加载大图片

作者头像
DragonKingZhu
发布2022-05-08 16:30:21
4770
发布2022-05-08 16:30:21
举报

在实际中,有些时候我们需要从SD卡中加载一张很大的图片到内存中,但是如果你手机存储很小的话,如果直接将这张大图片放入内容就会导致分配失败等异常问题。所以我们就需要一种手段,将大图片也能正常的加载到内存,而不出现异常的情况。

那如何才能将大图片加载到内存中,而不出现内存溢出?

Android系统提供了一个方法,通过显示比例加载图片,这样就会返回比原图更小的图片。

1: 先要获取该图片的参数情况,Android系统提供了一个BitmapFactory这个类

可以创建一个Bitmap对象,从不同的源可以获取图片资源。

代码语言:javascript
复制
BitmapFactory.decodeResource(res, id)

用如上的代码就能获得一个Bitmap对象。BitmapFactory.decodeResource方法的第二个参数就能获取到图片的各项参数

代码语言:javascript
复制
BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);

2: Options是一个类, 里面封装了图片的各项参数

代码语言:javascript
复制
/*inJustDecodeBounds等于true: 代表的是将返回的是null,不是bitmap的对象,但是却能得到源文件的参数情况*/
		    	opts.inJustDecodeBounds = true;

3:获取屏幕的宽和高

代码语言:javascript
复制
//获取屏幕的宽和高
		    	Display dp = getWindowManager().getDefaultDisplay();
		    	int screenWidth = dp.getWidth(); 
		    	int screenHeight = dp.getHeight();

4:计算缩放比例:

代码语言:javascript
复制
/*计算图片的缩放比例*/
		    	int scale = 1;
		    	int scaleWidth = imageWidth / screenWidth;
		    	int scaleheight = imageHeight / screenHeight;
		    	
		    	if(scaleWidth >= scaleheight && scaleWidth >= 1)
		    	{
		    		scale = scaleWidth;
		    	}
		    	else if (scaleheight > scaleWidth && scaleheight >= 1) {
					scale = scaleheight;
				}

5: 再获取Bitmap对象,以比例的方式去获取

代码语言:javascript
复制
/*设置图片的缩放比例*/
		    	opts.inSampleSize = scale;/*如果大于1, 请求解码器去对原图取样,返回一个更小的image*/
		    	opts.inJustDecodeBounds = false;
		    	Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
		    	
		    	/*显示图片*/
		    	ImageView iView = (ImageView) findViewById(R.id.iv);
		    	iView.setImageBitmap(bitmap);

整个代码:

代码语言:javascript
复制
public class MainActivity extends Activity {

    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Log.i("MainActivity", "onclick");
                
                /*先解析这张很大图片,得到图片参数情况*/
                Options opts = new Options();
                
                /*inJustDecodeBounds等于true: 代表的是将返回的是null,不是bitmap的对象,但是却能得到源文件的参数情况*/
                opts.inJustDecodeBounds = true;
                
                //BitMapFactory这个类是创建一个bitmap对象,是通过不同的源
                BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
                
                
                //获取到图片的宽和高
                int imageWidth = opts.outWidth;
                int imageHeight = opts.outHeight;
                
                //获取屏幕的宽和高
                Display dp = getWindowManager().getDefaultDisplay();
                int screenWidth = dp.getWidth(); 
                int screenHeight = dp.getHeight();
           
                
                /*计算图片的缩放比例*/
                int scale = 1;
                int scaleWidth = imageWidth / screenWidth;
                int scaleheight = imageHeight / screenHeight;
                
                if(scaleWidth >= scaleheight && scaleWidth >= 1)
                {
                    scale = scaleWidth;
                }
                else if (scaleheight > scaleWidth && scaleheight >= 1) {
                    scale = scaleheight;
                }
                
                
                /*设置图片的缩放比例*/
                opts.inSampleSize = scale;/*如果大于1, 请求解码器去对原图取样,返回一个更小的image*/
                opts.inJustDecodeBounds = false;
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);
                
                /*显示图片*/
                ImageView iView = (ImageView) findViewById(R.id.iv);
                iView.setImageBitmap(bitmap);
            }
        });
       
    }

}

效果图:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档