Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android簡易實戰教程--第二十八話《加載大圖片》

Android簡易實戰教程--第二十八話《加載大圖片》

編輯:關於Android編程

Android系統以ARGB表示每個像素,所以每個像素占用4個字節,很容易內存溢出。假設手機內存比較小,而要去加載一張像素很高的圖片的時候,就會因為內存不足導致崩潰。這種異常是無法捕獲的

內存不足並不是說圖片的大小決定的,最主要的因素是像素問題。

因此加載大圖片就要設置相應的縮放比例。

*計算機把圖片所有像素信息全部解析出來,保存至內存
*Android保存圖片像素信息,是用ARGB保存
*手機屏幕320*480,總像素:153600
*圖片寬高2400*3200,總像素7680000
*算法:得到縮放比率
*2400 / 320 = 7
*3200 / 480 = 6

代碼:

package com.itny.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;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void click(View v){
    	//解析圖片時需要使用到的參數都封裝在這個對象裡了
    	Options opt = new Options();
    	//不為像素申請內存,只獲取圖片寬高
    	opt.inJustDecodeBounds = true;
    	BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
    	//拿到圖片寬高
    	int imageWidth = opt.outWidth;
    	int imageHeight = opt.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){//scaleWidth >= 1      只縮放比屏幕像素大的圖片
    		scale = scaleWidth;
    	}
    	else if(scaleWidth < scaleHeight && scaleHeight >= 1){
    		scale = scaleHeight;
    	}
    	
    	//設置縮放比例
    	opt.inSampleSize = scale;
    	//這個時候有了縮放比了。因此要再一次為圖片申請內存,使用BitmapFactory去解析位圖
    	opt.inJustDecodeBounds = false;
    	//此時的Bitmap就是縮放後的Bitmap。
    	Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
    	
    	ImageView iv = (ImageView) findViewById(R.id.iv);
    	iv.setImageBitmap(bm);//Sets a Bitmap as the content of this ImageView.
    }
    
}
這樣就能加載一張較大的圖片了,運行如下:

 

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved