2016-03-09 6 views
2

Я прошел через множество ссылок и проверил различные коды для этого, но он еще не соответствует моим требованиям.Проблемы с обрезкой изображения (IDE: - Android Studio (Java))

Это мое требование;

  1. Я хочу выбрать изображение из памяти телефона или SD-карты (дать возможность пользователю выбрать каталог изображений) и обрезать его.

Проблема в нем, в леденец ОС, когда я выбираю изображение из галереи он не обеспечивает кадрирование вариант, следовательно, GetData возвращает нуль, но если выбрать изображение из фотографий он обрезает изображение и сохранить его, следовательно, GetData возвращает URI, но исходное изображение будет перезаписано этим обрезанным.

  1. В Jellybean ситуация обратная, если я выбираю изображение из галереи, все работает отлично, но из фотографий опция обрезки не приходит.

Ниже приведен фрагмент кода ..

public void selectImageFromGallery() 
{ 
     try 
     { 
      Globals g = (Globals) getApplication(); 
      int iWidthDP = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, g.screenWidth, getResources().getDisplayMetrics()); 
      int iHeightDP = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics()); 

      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      intent.putExtra("crop", "true"); 
      intent.putExtra("aspectX", 0); 
      intent.putExtra("aspectY", 0); 
      intent.putExtra("outputX", iWidthDP); 
      intent.putExtra("outputY", iHeightDP); 
      intent.putExtra("return-data", true); 
      startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_FROM_GALLERY); 
     } 
     catch(Exception ex) 
     { 
      Toast toast = Toast.makeText(this, "exception occurred in selectImageFromGallery" + 
        ex.getMessage().toString(), Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
} 


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

     try 
     { 
      if ((requestCode == PICK_FROM_GALLERY || requestCode == PICK_FROM_CAMERA) 
        && resultCode == RESULT_OK && null != data) 
      { 
       if (resultCode == RESULT_OK) 
       { 
        Bitmap bitmap = null; 
        Uri selectedImage = null; 
        if(requestCode == PICK_FROM_GALLERY || requestCode == PICK_FROM_CAMERA) { 
         selectedImage = data.getData(); 
         if(selectedImage == null) 
          selectedImage = (Uri)data.getExtras().get("data"); 
        } 
        if (Build.VERSION.SDK_INT < 19) 
        { 
         String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
         Cursor cursor = getContentResolver().query(selectedImage, 
           filePathColumn, null, null, null); 
         cursor.moveToFirst(); 
         int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
         String picturePath = cursor.getString(columnIndex); 
         cursor.close(); 
         bitmap = BitmapFactory.decodeFile(picturePath); 
        } 
        else 
        { 
         ParcelFileDescriptor parcelFileDescriptor; 
         try { 
          parcelFileDescriptor = getContentResolver().openFileDescriptor(selectedImage, "r"); 
          FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 
          bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor); 
          parcelFileDescriptor.close(); 
         } catch (FileNotFoundException ex) { 
          Toast toast = Toast.makeText(this, "exception occurred in onActivityResult" + ex.getMessage().toString(), Toast.LENGTH_SHORT); 
          toast.show(); 
         } catch (Exception ex) { 
          Toast toast = Toast.makeText(this, "exception occurred in onActivityResult" + ex.getMessage().toString(), Toast.LENGTH_SHORT); 
          toast.show(); 
         } 
        } 


        image.setScaleType(ImageView.ScaleType.FIT_XY); 
        image.setImageBitmap(bitmap); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      Toast toast = Toast.makeText(this, "exception occurred in onActivityResult" + ex.getMessage().toString(), Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    } 
} 

Заранее спасибо ..

+0

Вы хотите обрезать изображение, когда вы выбираете изображение из галереи или камеры? – RushDroid

+0

От обоих, но давайте теперь сосредоточимся на Галерее. – Gvs13

+0

Я предлагаю вам использовать библиотеку для этого легко. – RushDroid

ответ

0

я предлагаю вам использовать библиотеку для этого. вот шаг для установки:

первым добавить это в модуле build.gradle: приложение

это в андроида раздел:

repositories { 
    maven { url "https://jitpack.io" } 
} 

repositories { 
     mavenCentral() 

     maven { 
      url 'http://lorenzo.villani.me/android-cropimage/' 
     } 
    } 

это в зависимости раздел:

dependencies { 
     compile 'com.github.jkwiecien:EasyImage:1.2.1' 
     compile 'me.villani.lorenzo.android:android-cropimage:1.1.+' 
     compile 'com.squareup.picasso:picasso:2.5.2' 
} 

для выбора изображения с камеры

EasyImage.openCamera(Context, 0); 

для приемистости изображения из галереи

EasyImage.openGallery(Context, 1); 

после этого.

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


     EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() { 
      @Override 
      public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) { 
       //Some error handling 
      } 

      @Override 
      public void onImagePicked(File imageFile, EasyImage.ImageSource source, int type) { 

       // Picasso.with(MainActivity.this).load(imageFile).into(imageView); 

        Uri uri = null; 
        uri = Uri.fromFile(imageFile); 
        file = imageFile; 
        CropImageIntentBuilder builder = new CropImageIntentBuilder(200, 200, uri); 
        builder.setOutlineColor(0xFF03A9F4); 
        builder.setSourceImage(uri); //data.getData() 

        startActivityForResult(builder.getIntent(MainActivity.this),100); 
      } 

     }); 

     if ((requestCode == 100) && (resultCode == RESULT_OK)) { 
      // When we are done cropping, display it in the ImageView. 
      // imageView.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath())); 
      Picasso.with(MainActivity.this).load(file).into(imageView); 

     } 

    } 

Не забудьте добавить это в андроиде Android.manifest

<activity android:name="com.android.camera.CropImage"/> 

это поможет вам получить изображение из галереи и камеры с функцией растениеводства это уменьшить свой код и легко поддерживать на выбор образ.

Hoe это поможет вам

+0

Позвольте мне попробовать. – Gvs13

+0

Не забудьте объявить одну переменную «Файл» на глобальном уровне и изменить «imageView» - это ваше изображение. – RushDroid

+0

Можете ли вы поделиться местоположениями файлов lib, откуда я могу его загрузить. compile 'com.github.jkwiecien: EasyImage: 1.2.1 ' compile' me.villani.lorenzo.android:android-cropimage:1.1.+ ' – Gvs13