2016-09-23 3 views
0

Мне удалось либо сделать снимок с помощью камеры, либо выбрать из галереи, а затем передать путь к другому действию. В другом действии я показываю изображение в ImageView.Как обрезать изображение с пути?

private void initData() { 
    photoPath = getIntent().getStringExtra("path"); 
    Bitmap photo = BitmapFactory.decodeFile(photoPath); 
    rotatePhoto(photo); 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.btnCrop: 
      cropPhoto(photoPath); 
      break; 
     case R.id.btnText: 
      break; 
     case R.id.btnFrame: 
      break; 
    } 
} 

private void rotatePhoto(Bitmap bitmap) { 
    ExifInterface exif = null; 
    try { 
     exif = new ExifInterface(photoPath); 
    } catch (IOException e) { 
     Log.d(TAG, "Rotate photo: " + e.getMessage()); 
    } 
    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
    Matrix matrix = new Matrix(); 
    switch (orientation) { 
     case ExifInterface.ORIENTATION_ROTATE_90: 
      matrix.setRotate(90); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_180: 
      matrix.setRotate(180); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_270: 
      matrix.setRotate(270); 
      break; 
    } 
    Bitmap rotatedPhoto = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
    ivEdit.setImageBitmap(rotatedPhoto); 
} 

private void cropPhoto(String path) { 
    try { 
     cropImageUri = Uri.parse(path); 
     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     cropIntent.setDataAndType(cropImageUri, "image/*"); 
     cropIntent.putExtra("crop", "true"); 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     cropIntent.putExtra("scale", true); 
     cropIntent.putExtra("outputX", 500); 
     cropIntent.putExtra("outputY", 500); 
     cropIntent.putExtra("return-data", false); 
     startActivityForResult(cropIntent, REQUEST_CROP); 
    } catch (ActivityNotFoundException e) { 
     String errorMessage = "Whoops - your device doesn't support the crop action!"; 
     Toast toast = Toast 
       .makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == REQUEST_CROP) { 
     if (data != null) { 
      Bundle extras = data.getExtras(); 
      Bitmap bb = extras.getParcelable("data"); 
      ivEdit.setImageBitmap(bb); 
     } 
    } 
} 

Как я могу обрезать это изображение, а затем обновить ImageView? Я пробовал обрезать другие изображения, но они должны поступать из галереи. Возможно ли это? Если нет, предложите способ. То, как я пытаюсь это сделать, я получаю «Невозможно загрузить фотографию».

ответ

-1

попробовать этот код:

public String compressImage(String imageUri) { 

     String filePath = getRealPathFromURI(imageUri); 
     Bitmap scaledBitmap = null; 

     BitmapFactory.Options options = new BitmapFactory.Options(); 

//  by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If 
//  you try the use the bitmap here, you will get null. 
     options.inJustDecodeBounds = true; 
     Bitmap bmp = BitmapFactory.decodeFile(filePath, options); 

     int actualHeight = options.outHeight; 
     int actualWidth = options.outWidth; 

//  max Height and width values of the compressed image is taken as 816x612 

     float maxHeight = 816.0f; 
     float maxWidth = 612.0f; 
     float imgRatio = actualWidth/actualHeight; 
     float maxRatio = maxWidth/maxHeight; 

//  width and height values are set maintaining the aspect ratio of the image 

     if (actualHeight > maxHeight || actualWidth > maxWidth) { 
      if (imgRatio < maxRatio) {    imgRatio = maxHeight/actualHeight;    actualWidth = (int) (imgRatio * actualWidth);    actualHeight = (int) maxHeight;    } else if (imgRatio > maxRatio) { 
       imgRatio = maxWidth/actualWidth; 
       actualHeight = (int) (imgRatio * actualHeight); 
       actualWidth = (int) maxWidth; 
      } else { 
       actualHeight = (int) maxHeight; 
       actualWidth = (int) maxWidth; 

      } 
     } 

//  setting inSampleSize value allows to load a scaled down version of the original image 

     options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); 

//  inJustDecodeBounds set to false to load the actual bitmap 
     options.inJustDecodeBounds = false; 

//  this options allow android to claim the bitmap memory if it runs low on memory 
     options.inPurgeable = true; 
     options.inInputShareable = true; 
     options.inTempStorage = new byte[16 * 1024]; 

     try { 
//   load the bitmap from its path 
      bmp = BitmapFactory.decodeFile(filePath, options); 
     } catch (OutOfMemoryError exception) { 
      exception.printStackTrace(); 

     } 
     try { 
      scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,Bitmap.Config.ARGB_8888); 
     } catch (OutOfMemoryError exception) { 
      exception.printStackTrace(); 
     } 

     float ratioX = actualWidth/(float) options.outWidth; 
     float ratioY = actualHeight/(float) options.outHeight; 
     float middleX = actualWidth/2.0f; 
     float middleY = actualHeight/2.0f; 

     Matrix scaleMatrix = new Matrix(); 
     scaleMatrix.setScale(ratioX, ratioY, middleX, middleY); 

     Canvas canvas = new Canvas(scaledBitmap); 
     canvas.setMatrix(scaleMatrix); 
     canvas.drawBitmap(bmp, middleX - bmp.getWidth()/2, middleY - bmp.getHeight()/2, new Paint(Paint.FILTER_BITMAP_FLAG)); 

//  check the rotation of the image and display it properly 
     ExifInterface exif; 
     try { 
      exif = new ExifInterface(filePath); 

      int orientation = exif.getAttributeInt(
        ExifInterface.TAG_ORIENTATION, 0); 
      Log.d("EXIF", "Exif: " + orientation); 
      Matrix matrix = new Matrix(); 
      if (orientation == 6) { 
       matrix.postRotate(90); 
       Log.d("EXIF", "Exif: " + orientation); 
      } else if (orientation == 3) { 
       matrix.postRotate(180); 
       Log.d("EXIF", "Exif: " + orientation); 
      } else if (orientation == 8) { 
       matrix.postRotate(270); 
       Log.d("EXIF", "Exif: " + orientation); 
      } 
      scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, 
        scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, 
        true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     FileOutputStream out = null; 
     String filename = getFilename(); 
     try { 
      out = new FileOutputStream(filename); 

//   write the compressed bitmap at the destination specified by filename. 
      scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return filename; 

    } 

Метод GetFileName() :: Это создает папку в SDCard, используемой для хранения изображений.

private String getRealPathFromURI(String contentURI) { 
     Uri contentUri = Uri.parse(contentURI); 
     Cursor cursor = getContentResolver().query(contentUri, null, null, null, null); 
     if (cursor == null) { 
      return contentUri.getPath(); 
     } else { 
      cursor.moveToFirst(); 
      int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
      return cursor.getString(index); 
     } 
    } 

Метод calculateInSampleSize :: вычисляет соответствующее значение для inSampleSize на основе фактических и требуемых размеров:

public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     final int heightRatio = Math.round((float) height/ (float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;  }  final float totalPixels = width * height;  final float totalReqPixelsCap = reqWidth * reqHeight * 2;  while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
     inSampleSize++; 
    } 

    return inSampleSize; 
} 
+0

Я не понимаю, как это помогает мне. Мне нужно обрезать изображение, которое я уже показал в изображении, а затем обновить изображение. – Esteban

+0

Почему бы вам не помочь? Вы должны использовать свой путь. Поэтому измените 'String filePath = getRealPathFromURI (imageUri);' на 'String filePath = photePath;'. Код просто делает больше, чем вам нужно, и, возможно, это немного запутанно. Но он создает измененный битмап, который вы можете назначить своему ImageView. Так лучше сказать спасибо. – greenapps

+0

Хорошо, попробуй. Может быть, я слишком отреагировал, так как это сбивает с толку. Благодаря! – Esteban

Смежные вопросы