2012-07-23

Android Image應用(一) - 取得手機內的圖檔

今天介紹多媒體應用中兩個重要的圖片、相機應用的其中一個:圖片

如果取得手機內的圖檔應該是要做有關多媒體應用程式常會遇到的事

下面就開始實作如果取得手機內的圖檔資料


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
   <Button   
        android:id="@+id/b01"  
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content&
    />  
    <ImageView  
        android:id="@+id/iv01"  
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
     />  
</LinearLayout>  



GetPicturesActivity.java
package jim.demo.getpictures;

import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class GetPicturesActivity extends Activity {
	 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //找尋Button按鈕
        Button button = (Button)findViewById(R.id.b01);
        //設定按鈕內文字
        button.setText("選擇圖片");
        //設定按鈕監聽式
        button.setOnClickListener(new Button.OnClickListener(){
	  public void onClick(View v) {
	 	Intent intent = new Intent();
	    //開啟Pictures畫面Type設定為image
	       intent.setType("image/*");
            //使用Intent.ACTION_GET_CONTENT這個Action                                            //會開啟選取圖檔視窗讓您選取手機內圖檔
	        intent.setAction(Intent.ACTION_GET_CONTENT); 
	    //取得相片後返回本畫面
	        startActivityForResult(intent, 1);
	  }
        	
        });
    }
    
    //取得相片後返回的監聽式
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	//當使用者按下確定後
	if (resultCode == RESULT_OK) {
	   //取得圖檔的路徑位置
	   Uri uri = data.getData();
	   //寫log
	   Log.e("uri", uri.toString());
	   //抽象資料的接口
	   ContentResolver cr = this.getContentResolver();
	 try {
	   //由抽象資料接口轉換圖檔路徑為Bitmap
  	   Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
	   //取得圖片控制項ImageView
	   ImageView imageView = (ImageView) findViewById(R.id.iv01);
	   // 將Bitmap設定到ImageView
	   imageView.setImageBitmap(bitmap);
	  } catch (FileNotFoundException e) {
	    Log.e("Exception", e.getMessage(),e);
	  }
	}
	  super.onActivityResult(requestCode, resultCode, data);
	}
}


執行畫面



後記:

          呼叫android取得手機內圖片很簡單,只要用Intent.ACTION_GET_CONTENT

重點在於取得圖檔後面的處理,因為取得只是取出該圖檔的存放路徑,所以必須經由

抽象接口ContentResolver再把該圖檔轉換為Bitmap,轉換為Bitmap主要是用來餵給imageView


下面是幾種常用可以設定imageView內圖片的型式
          imageView.setImageBitmap(bitmap) //bitmap圖檔型式
  imageView.setImageDrawable(drawable) //drawable圖檔型式
  imageView.setImageResource(resId) //存在應用程式中res/drawable內的圖片
  imageView.setImageURI(uri)//網路圖片路徑

bitmap和drawable是可以互轉,我再另外開一篇介紹bitmap和drawable轉換


有問題再留言或寫信給我,謝謝。

3 則留言:

  1. 請問一下
    imageView.setImageResource(resId)這個是設定imageView的圖片

    假如我今天已經設定好imageview的resId
    那我可以反過來透過imageView取得resId嗎?

    回覆刪除
    回覆
    1. 我不清楚你想取得是什麼

      因為res/drawable內的圖片早就預設存在程式中

      所以不需要反向讀取

      用view.getResources().getResourceName(resid)

      是可以取得該文件的名稱

      如果你想要的是取得手機內的圖檔

      可以用取得圖檔路徑,再轉換為Bitmap出來
      Uri uri = data.getData();
      ContentResolver cr = this.getContentResolver();
      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));

      刪除
  2. 大大 我可以問嗎
    如果我已經讀取到圖片
    但是想把他的路徑轉成字串之後存入TXT檔案中
    怎麼做?

    回覆刪除

您的寶貴建議是我前進的動力!