Android基礎第九天易忘部分(載入大圖片和縮放圖片)

我叫阿狸貓發表於2014-12-08

1.載入大圖片到記憶體

/**
 * 縮小大圖片的原理:
 * 本來大圖片某一塊大小由100個畫素點來進行顯示,並且這100個畫素點顏色差不多
 * 那麼現在這100個畫素點因為顏色差不多,所以由1個畫素點來代替
 * 這樣就實現了圖片縮小顯示的功能
 * 
 * 
 * 載入大圖片到記憶體思路:
 * 獲取到圖片的寬高(注意不要載入到記憶體),然後用圖片的寬高除以手機的寬高,以大的值為縮放比例(當然要判斷圖片解析度是要大於手機解析度的)
 * 然後計算出縮放後的圖片寬高,再載入到記憶體裡 
 */
public class MainActivity extends Activity {

	private ImageView iv;

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

	private void init() {
		iv = (ImageView) findViewById(R.id.iv);
	}

	public void loadImg (View view) {
		//這種載入圖片的方式是根據圖片的解析度來分配記憶體空間的,一旦圖片解析度大於螢幕的就要出記憶體溢位異常
		/*Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg");
		iv.setImageBitmap(bitmap);*/
		
		WindowManager windowManager = getWindowManager();
		Display defaultDisplay = windowManager.getDefaultDisplay();
		int width = defaultDisplay.getWidth();								//手機螢幕的寬度
		int height = defaultDisplay.getHeight();							//手機螢幕的高度
		System.out.println("螢幕width:"+width);
		System.out.println("螢幕height:"+height);
		
		Options opts = new Options();
		opts.inJustDecodeBounds = true;										//不要直接載入圖片到記憶體,而只是載入一些圖片的資訊(比如寬度高度資訊)這樣就不會記憶體溢位了
		Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg", opts );
		int outWidth = opts.outWidth;										//圖片的寬度
		int outHeight = opts.outHeight;										//圖片的高度
		System.out.println("圖片outWidth:"+outWidth);
		System.out.println("圖片outHeight:"+outHeight);
		
		int dx = outWidth/width;
		int dy = outHeight/height;
		int scale = 1;
		
		if(dx>dy&&dy>1){
			scale = dx;
			System.out.println("按照水平方法縮放,縮放比例:"+dx);
		}else if(dy>dx&&dx>1){
			scale = dy;
			System.out.println("按照垂直方法縮放,縮放比例:"+dy);
		}
		
		opts.inSampleSize = scale;											//設定縮放比例
		opts.inJustDecodeBounds = false;									//直接載入圖片到記憶體,而不只是載入圖片資訊
		bitmap = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg", opts);
		iv.setImageBitmap(bitmap);
	}
}



2.拷貝圖片並縮放

/**
 * 這個縮放是建立在拷貝原圖的基礎上再進行縮放的
 * 和載入大圖片到記憶體還是有區別的
 */
public class MainActivity extends Activity {

	private ImageView iv1;
	private ImageView iv2;
	private Bitmap srcBitmap;							//原圖
	private Bitmap copyBitmap;							//拷貝後的圖

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

	private void init() {
		iv1 = (ImageView) findViewById(R.id.iv1);
		srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);		//原圖
		iv1.setImageBitmap(srcBitmap);
		
		iv2 = (ImageView) findViewById(R.id.iv2);
		//根據原圖的長寬和原圖配置,建立一個相同尺寸的拷貝圖片畫布   第三個引數Config.ARGB_4444   Config.ARGB_8888
		copyBitmap = Bitmap.createBitmap(2*srcBitmap.getWidth(), 2*srcBitmap.getHeight(), srcBitmap.getConfig());
	}
	
	public void copy (View view) {
		Canvas canvas = new Canvas(copyBitmap);					//建立畫板,設定那個空白的畫布
		Paint paint = new Paint();								//準備一個畫筆
		paint.setColor(Color.BLACK);							//設定畫筆預設的顏色(可選)
		paint.setStrokeWidth(10);								//設定畫筆的粗細(可選)
		Matrix matrix = new Matrix();							
		/*x = 1x + 0y + 0z
		  y = 0x + 1y + 0z
		  z = 0x + 0y + 1z*/
		//這個是底層的方法,最終呼叫的還是此方法
		/*matrix.setValues(new float[]{
			1,0,0,			//長
			0,1,0,			//寬
			0,0,1			//
		});*/
		//matrix.setScale(0.5f, 0.5f);							//X和Y方向都為原先的2分之1
		matrix.setScale(2.0f, 2.0f);							//X和Y方向都為原先的2倍,那麼畫布的長寬也要設定成原先的2倍
		canvas.drawBitmap(srcBitmap, matrix , paint);			//畫畫   引數一:被臨摹的圖   引數二:縮放比,只new Matrix()就表示不變  引數三:畫筆
		
		iv2.setImageBitmap(copyBitmap);
	}
}



相關文章