android加载大图片到内存
jopen
11年前
在andorid编程中,我们有时需要讲一张像素很高的图片加载的图片中,如果我们是这样去做
public void load1(View view) { String src = "mnt/sdcard/DSC.jpg"; Bitmap bitmap = BitmapFactory.decodeFile(src); this.iv_img.setImageBitmap(bitmap); }可能就是抛出java.lang.OutOfMemoryError异常
这是由于在android系统中,默认情况下,dailvike虚拟机只会为每个应用程序分配16M的内存空间
而加载高像素的图片是非常消耗内存的,如果这时我们不将图片进行缩放就直接加载到内存,很容易就会抛出内存泄漏的异常
因此,我们可以这么来操作
public class MainActivity extends Activity { private ImageView iv_img; private int windowHeight; private int windowWidth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.iv_img = (ImageView) this.findViewById(R.id.iv_img); WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 第一种获取手机屏幕宽高的方法 this.windowHeight = manager.getDefaultDisplay().getHeight(); this.windowWidth = manager.getDefaultDisplay().getWidth(); System.out.println("手机宽 :" + this.windowWidth); System.out.println("手机高 :" + this.windowHeight); // 第二种获取手机屏幕宽高的方法,但是getSize()是从 API Level 13才有的方法 // Point outSize = new Point(); // manager.getDefaultDisplay().getSize(outSize ); // this.windowWidth = outSize.x; // this.windowHeight = outSize.y; } public void load1(View view) { String src = "mnt/sdcard/DSC.jpg"; Bitmap bitmap = BitmapFactory.decodeFile(src); this.iv_img.setImageBitmap(bitmap); } public void load2(View view) { String src = "mnt/sdcard/DSC.jpg"; // 图片解析的配置 Options options = new Options(); // 不去真正解析图片,只是获取图片的宽高 options.inJustDecodeBounds = true; BitmapFactory.decodeFile(src, options); int imageWidth = options.outWidth; int imageHeight = options.outHeight; System.out.println("图片宽 :" + imageWidth); System.out.println("图片高 :" + imageHeight); int scaleX = imageWidth / this.windowWidth; int scaleY = imageHeight / this.windowHeight; int scale = 1; if (scaleX >= scaleY && scaleX >= 1) { // 水平方向的缩放比例比竖直方向的缩放比例大,同时图片的宽要比手机屏幕要大,就按水平方向比例缩放 System.out.println("按宽比例缩放"); scale = scaleX; } else if (scaleY >= scaleX && scaleY >= 1) { // 竖直方向的缩放比例比水平方向的缩放比例大,同时图片的高要比手机屏幕要大,就按竖直方向比例缩放 System.out.println("按高比例缩放"); scale = scaleY; } System.out.println("缩放比例:" + scale); // 真正解析图片 options.inJustDecodeBounds = false; // 设置采样率 options.inSampleSize = scale; Bitmap bitmap = BitmapFactory.decodeFile(src,options); this.iv_img.setImageBitmap(bitmap); } }简单的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:onClick="load1" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="不缩放加载图片" /> <ImageView android:id="@+id/iv_img" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignLeft="@+id/button1" android:layout_below="@+id/button1" android:src="@drawable/ic_launcher" /> <Button android:onClick="load2" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/button1" android:layout_toRightOf="@+id/button1" android:text="缩放加载图片" /> </RelativeLayout>进过缩放之后的图片再加载到内存,就不会再抛出异常。