从库中获取图片(位图)的代码无效

时间:2012-04-24 13:51:56

标签: android bitmap gallery

我的解决方案:好的答案。这就是我提出的。不确定回答我自己的问题或者把它放在这里以获得正确的stackoverflowness所以如果有人知道请分享。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
        case cameraData:
            Bundle extras = data.getExtras();
            bmp = (Bitmap) extras.get("data");
            iv.setVisibility(View.VISIBLE);
            break;
        case SELECT_PICTURE:
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            File imgFile = new File(selectedImagePath);
            bmp = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
            break;
        }
        iv.setVisibility(View.VISIBLE);
        iv.setImageBitmap(bmp);
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 50, stream); // compress
        byte[] ba = stream.toByteArray();
        image_str = Base64.encodeBytes(ba);
    }
}

/////////////////////////////////////////////// ///////////////////////////////////////////

好的,我的画廊中有照片的路径。我想拍摄这张照片并将其变成一个捆绑包,这样我就可以对它进行64次编码以上传到我的服务器。这是我的onActivityResult。我的工作就是用相机拍照而不是从画廊里拿到它。

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK){
            switch(requestCode){
            case cameraData:                
                Bundle extras = data.getExtras();
                bmp = (Bitmap) extras.get("data");
                Log.e("picture","Take Picture");
                break;
            case SELECT_PICTURE:
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                Log.e("picture",selectedImagePath);
                File imgFile = new  File(selectedImagePath);                    
                bmp = (Bitmap)     BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                Bundle extras1 = ((Cursor) imgFile).getExtras();
    //          bmp = (Bitmap) extras1.get("data");
                Log.e("picture","from Gallery");
                break;
            }
        }
    } 

基础64代码不是我的网站:http://blog.sptechnolab.com/2011/03/09/android/android-upload-image-to-server/

的getPath:

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

3 个答案:

答案 0 :(得分:0)

为什么要将位图转换为捆绑?为什么要在上传之前将文件转换为base64字符串?

Herehere是上传文件的示例。

答案 1 :(得分:0)

http://pastebin.com/3A5gMFsF

似乎做你想做的事。看起来当你得到一个文件URI时,你需要挖掘一些内容解析器来实际获取文件本身。

Uri photoUri = data.getData();
    if (photoUri != null)
    {
    try {
          String[] filePathColumn = {MediaStore.Images.Media.DATA};
          Cursor cursor = getContentResolver().query(photoUri, filePathColumn, null, null, null); 
          cursor.moveToFirst();
          int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
          String filePath = cursor.getString(columnIndex);
          cursor.close();
          bMap_image = BitmapFactory.decodeFile(filePath);
          ImageView img = (ImageView) findViewById(R.id.gallery1);
          img.setImageBitmap(bMap_image);

编辑:我在这个版本和你的版本之间看到的唯一区别是这个版本在调用BitMap.Decode之前不会将filePath转换为File。它直接在内容resolover返回的文件路径上调用BitmapFactory.decodeFile。

答案 2 :(得分:0)

您可以直接将位图转换为base64。

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
byte[] bitmapdata = bos.toByteArray();

byte[] dataToUpload = Base64.encode(bitmapdata , DEFAULT);

要将位图转换为Bundle,请使用bundle.putParcelable("dataToUpload", bitmap) 并使用bundle.getParcelable("dataToUpload")退休。