網頁

2011年9月27日 星期二

Android學習_uri轉byte

在進行圖片的處理時,常常會遇到需要將手機內圖片(照片)轉成byte再傳出去(例如facebook的圖片上傳)。

步驟:
1. 將uri傳成inputstream

ContentResolver resolver = getContentResolver();
resolver.openInputStream(uri);


*20120604補充第一步驟程式碼:
byte[] buffer;
ContentResolver resolver = getContentResolver();
buffer = readStream(resolver.openInputStream(Uri.parse(Picuri.toString())));


2. 將inputstream轉成byte[]

public static byte[] readStream(InputStream inStream) throws Exception {
byte[] buffer = new byte[1024];
int len = -1;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return data;
}


接著,就可以將byte[]擺放傳入自己或別人的方法中,完成圖片的傳遞。

8 則留言:

  1. 不好意思 版大
    我想請問一下
    我這樣打對嗎?

    ContentResolver resolver = getContentResolver();
    resolver.openInputStream("drawable/p01.jpg");

    回覆刪除
  2. resolver.openInputStream的參數為Uri,指的是手機內的檔案,大概類似『file:///ola/android.txt』這樣的描述,其目的是將該檔案讀出來,並返回InputStream的格式。

    你寫的『drawable/p01.jpg』指的是drawable,也就是程式內的資源。

    如果你最後的目的是取得byte[],那可以直接把drawable內的圖轉成bitmap,再由bitmap轉byte[]。

    回覆刪除
  3. //將路徑轉為uri
    String ImagePath = "file://sdcard/DCIM/13.jpg";
    Uri uri = Uri.parse(ImagePath);
    //將uri轉成intputstream
    ContentResolver resolver = getContentResolver();
    resolver.openIntputStream(uri);

    請問從手機中抓取圖片uri 轉成intputstream 這樣是正確的嗎

    回覆刪除
  4. file:後要"三個"/,
    即file:///sdcard/DCIM/13.jpg

    或是用Environment.getExternalStorageDirectory()取得檔案位置

    回覆刪除
  5. 感謝ola大

    另外修改後

    //將路徑轉為uri
    String ImagePath = "file:///sdcard/DCIM/13.jpg";
    Uri uri = Uri.parse(ImagePath);
    //將uri轉成inputstream
    ContentResolver resolver = getContentResolver();
    resolver.openInputStream(uri);


    其中 resolver.openInputStream(uri);
    這行有錯誤

    Multiple markers at this line
    - Syntax error on token "uri", VariableDeclaratorId expected after
    this token

    不知道是哪邊有錯誤

    回覆刪除
  6. 不好意思,看了很久還是不太懂步驟一要怎麼接上步驟二?謝謝!

    回覆刪除
  7. resolver.openInputStream(uri);的output就是inputstream,把inputstream帶入第二個函式中。

    我把第一部份的程式碼補充一下。

    回覆刪除