2015-03-16 2 views
0

В моем приложении я поддерживаю использование Camera для получения изображения и выбора с устройства. У меня проблема: compressing изображение, выбранное с устройства. Он настолько большой, когда я решаю Encode его на Base64, поэтому я могу отправить его по сети, я получаю TimeOutError. Это мой код ниже.Сжатие изображения, выбранного с устройства Android

OpenImage

private void openImageIntent(){ 
    // Determine Uri of camera image to save. 
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "amfb" + File.separator); 
    root.mkdir(); 
    final String fname = "img_" + System.currentTimeMillis() + ".jpg"; 
    final File sdImageMainDirectory = new File(root, fname); 
    outputFileUri = Uri.fromFile(sdImageMainDirectory); 

    // Camera. 
    final List<Intent> cameraIntents = new ArrayList<Intent>(); 
    final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    final PackageManager packageManager = getActivity().getPackageManager(); 
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
    for (ResolveInfo res : listCam){ 
     final String packageName = res.activityInfo.packageName; 
     final Intent intent = new Intent(captureIntent); 
     intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
     intent.setPackage(packageName); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
     cameraIntents.add(intent); 
    } 

    //FileSystem 
    final Intent galleryIntent = new Intent(); 
    galleryIntent.setType("image/*"); 
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

    // Chooser of filesystem options. 
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 
    // Add the camera options. 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{})); 
    startActivityForResult(chooserIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 

} 

А потом onActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == getActivity().RESULT_OK) { 
     if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { 
      final boolean isCamera; 
      if (data == null) { 
       isCamera = true; 
      } else { 
       final String action = data.getAction(); 
       if (action == null) { 
        isCamera = false; 
       } else { 
        isCamera = action.equals(MediaStore.ACTION_IMAGE_CAPTURE); 
       } 
      } 

      Uri selectedImageUri; 
      if (isCamera) { 
       selectedImageUri = outputFileUri; 
       //Bitmap factory 
       BitmapFactory.Options options = new BitmapFactory.Options(); 
       // downsizing image as it throws OutOfMemory Exception for larger 
       // images 
       options.inSampleSize = 8; 
       final Bitmap bitmap = BitmapFactory.decodeFile(selectedImageUri.getPath(), options); 
       profileImage.setImageBitmap(bitmap); 
      } else { 
       selectedImageUri = data == null ? null : data.getData(); 
       //Log.d("ImageURI", selectedImageUri.getLastPathSegment()); 
       //Bitmap factory 
       BitmapFactory.Options options = new BitmapFactory.Options(); 
       // downsizing image as it throws OutOfMemory Exception for larger 
       // images 
       options.inSampleSize = 8; 
       try { 
        InputStream input = getActivity().getContentResolver().openInputStream(selectedImageUri); 
        final Bitmap bitmap = BitmapFactory.decodeStream(input); 
        profileImage.setImageBitmap(bitmap); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } else if (resultCode == getActivity().RESULT_CANCELED){ 
     // user cancelled Image capture 
     Toast.makeText(getActivity(), 
       "User cancelled image capture", Toast.LENGTH_SHORT) 
       .show(); 
    } else { 
     // failed to capture image 
     Toast.makeText(getActivity(), 
       "Sorry! Failed to capture image", Toast.LENGTH_SHORT) 
       .show(); 
    } 
    //super.onActivityResult(requestCode, resultCode, data); 
} 

ответ

0

Я надеюсь, что функция I пишет поможет вам.

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // CREATE A MATRIX FOR THE MANIPULATION 
    Matrix matrix = new Matrix(); 
    // RESIZE THE BIT MAP 
    matrix.postScale(scaleWidth, scaleHeight); 
    // "RECREATE" THE NEW BITMAP 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
    return resizedBitmap; 
} 
+0

Давай. Мне нравится идея манипулирования матрицами. Мне не приходило в голову использовать это. Но это сработало. Благодарю. –