Android 載入大圖片到記憶體,
本文示範android中圖片載入到記憶體
首先設計介面:
代碼如下:
<LinearLayout 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:orientation="vertical" tools:context=".MainActivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="load" android:text="載入圖片到記憶體" /> <ImageView android:id="@+id/iv" android:layout_width="fill_parent" android:layout_height="fill_parent" /></LinearLayout>
往mnt/sdcard中上傳測試圖片
添加邏輯部分代碼:
public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); } public void load() { Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg"); iv.setImageBitmap(bitmap); }}
運行代碼,產生錯誤,原因是圖片太大(選取的是大照片)
可以使用BitmapFactory中包含的靜態類Options在不解析圖片資訊的前提下得到圖片的寬高資訊:
BitmapFactory.Options opts = new Options(); // 不去解析圖片資訊,只是得到圖片的頭部資訊 寬高 opts.inJustDecodeBounds = true; BitmapFactory.decodeFile("/sdcard/a.jpg", opts); int imageHeight = opts.outHeight; int imagewidth = opts.outWidth; System.out.println("圖片寬:" + imagewidth); System.out.println("圖片高" + imageHeight);
運行一下:
09-04 06:09:10.519: I/System.out(1812): 圖片寬:2560
09-04 06:09:10.519: I/System.out(1812): 圖片高1920
接下來得到手機螢幕的寬高:
//得到手機螢幕的寬高 WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE); int height = wm.getDefaultDisplay().getHeight(); int width = wm.getDefaultDisplay().getWidth();
可以看到getHeight與getWidth方法均已淘汰,使用下面的方法替代:
// 得到手機螢幕的寬高 WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); Point outSize = new Point(); wm.getDefaultDisplay().getSize(outSize); // 3.0以後的版本才能使用
完整代碼如下:
package com.wuyudong.loadimage;import android.os.Bundle;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.graphics.Point;import android.view.Menu;import android.view.View;import android.view.WindowManager;import android.widget.ImageView;public class MainActivity extends Activity { private ImageView iv; private int windowHeight; private int windowWidth; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); // 得到手機螢幕的寬高 WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); windowHeight = wm.getDefaultDisplay().getHeight(); windowWidth = wm.getDefaultDisplay().getWidth(); //Point outSize = new Point(); //wm.getDefaultDisplay().getSize(outSize); // 3.0以後的版本才能使用 //windowHeight = outSize.y; //windowWidth = outSize.x; } public void load(View view) { // Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg"); // iv.setImageBitmap(bitmap); // 圖片解析的配置 BitmapFactory.Options opts = new Options(); // 不去解析圖片資訊,只是得到圖片的頭部資訊 寬高 opts.inJustDecodeBounds = true; BitmapFactory.decodeFile("/sdcard/a.jpg", opts); int imageHeight = opts.outHeight; int imagewidth = opts.outWidth; System.out.println("圖片寬:" + imagewidth); System.out.println("圖片高" + imageHeight); // 計算縮放比例 int scaleX = imagewidth / windowWidth; int scaleY = imageHeight / windowHeight; int scale = 1; if (scaleX > scaleY & scaleY >= 1) { scale = scaleX; } if (scaleY > scaleX & scaleX >= 1) { scale = scaleY; } //解析圖片 opts.inJustDecodeBounds = false; //採樣率 opts.inSampleSize = scale; Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg", opts); iv.setImageBitmap(bitmap); }}