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

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

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

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

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

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

BitmapFactory.decodeResource(res, id)

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

BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);

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

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

3:获取屏幕的宽和高

//获取屏幕的宽和高
		    	Display dp = getWindowManager().getDefaultDisplay();
		    	int screenWidth = dp.getWidth();
		    	int screenHeight = dp.getHeight();

4:计算缩放比例:

/*计算图片的缩放比例*/
		    	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对象,以比例的方式去获取

/*设置图片的缩放比例*/
		    	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);

整个代码:

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);
            }
        });
       
    }

}

效果图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 22:32:17

Android学习之多媒体开发---加载大图片的相关文章

Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)

1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然后是" rgb" 颜色表示范围 00000000 ~~~ffffffff 2.加载图片到内存: 上面说到了图形表示使用4byte,和int一样,所以Android里面每个像素点都是使用一个int来表示的. Bitmap bitmap = BitmapFactory.decodeResour

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

Android加载大图片(压缩)

转载自http://blog.csdn.net/junjx/article/details/7798604 在Android开发中,我们经常需要加载图片.但是图片的尺寸往往会很大,如果我们要的是比较小的图片,在Android有限的内存下,我们显然不能把大尺寸的图片放到内存里,这样不但效率降低,而且会导致java.lang.OutOfMemory异常,相信很多朋友都遇到过这样的问题,那么该怎么解决这一问题呢?其实在Android官方文档中早已给出了解决的方案. 一.读Bitmap的尺寸和类型   

Android 高效加载大图片避免OOM

参考链接:http://blog.csdn.net/coderinchina/article/details/40964205 我们项目中经常会加载图片,有时候如果加载图片过多的话,小则导致程序很卡,重则OOM导致App挂了,今天翻译https://developer.android.com/training/displaying-bitmaps/index.html,学习Google高效加载大图片的方法. 图片有各种形状和大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

[android] 加载大图片到内存

默认情况下,android程序分配的堆内存大小是16,虚拟机上面的VM Heep就是设置它的 一个图片所占的内存,比如1920*2560像素的图片需要,1920*2560*3至少这些的内存byte 找到ImageView控件对象 调用BitmapFactory对象的decodeFile(pathName)方法,来获取一个位图对象,参数:pathName是String类型的图片路径 把图片导入到手机的sdcard目录下面 调用ImageView对象的setImageBitmap(bitemap)方

Android加载大图片到内存

加载大图片到内存 步骤: 步骤一: 获取品屏幕的宽高数据;[HD1] 步骤二: 获取图片的宽高;[HD2] 步骤三: 计算屏幕与图片的宽高比例,按照差距最大的进行缩放处理;[HD3] 步骤四: 图片的缩放处理;[HD4] [HD1]// 获取手机的屏幕的窗体大小 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = windowManager.getDef

Android -- 加载大图片的方法

在android中要加载一张大图片到内存中如果通过如下方式进行: Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg"); iv.setImageBitmap(bitmap); 则会抛出内存溢出异常Caused by: java.lang.OutOfMemoryError 正确的做法应该是这样的: public class MainActivity extends Activity { private ImageView iv;

android95 缩放加载大图片

MainActivity: package com.itheima.loadimage; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Point; i