1

我的解决方案: 好的,一些很好的答案。这就是我想出的。不确定回答我自己的问题或将其放在这里以获得适当的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;
            }
        }
    } 

base 64 代码不是我的,来自这个站点:http: //blog.sptechnolab.com/2011/03/09/android/android-upload-image-to-server/

获取路径:

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);
}
4

3 回答 3

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").

于 2012-04-24T14:16:49.727 回答
0

为什么要将位图变成一个包?以及为什么要在上传之前将文件转换为 base64 字符串?

这里这里是上传文件的示例。

于 2012-04-24T14:13:04.857 回答
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。它直接在内容解析器返回的文件路径上调用 BitmapFactory.decodeFile。

于 2012-04-24T14:13:07.197 回答