2014-12-16 13 views
14

Sto tentando di ritagliare un'immagine ma voglio essere in grado di impostare l'area ritagliata esattamente a 640 px x 640 px. Voglio impedire a un utente di passare a un'area molto piccola. Quindi fondamentalmente preferirei avere un'altezza e una larghezza fisse per l'area di ritaglio. Ho esaminato diverse librerie di terze parti ma non vedo come risolvere questo problema. Come posso fare questo?Ritaglia un'immagine fissa in Android

enter image description here

+3

"Come posso fare questo?" - iniziare con una delle librerie e modificarla per incorporare la funzione desiderata. – CommonsWare

+0

@CommonsWare L'ho fatto. Controlla la mia risposta e vota se è ciò che intendi :) – mklimek

risposta

4

C'è un metodo che si può useÆ

private void performCrop(){ 
    try { 
     //call the standard crop action intent (the user device may not support it) 
     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     //indicate image type and Uri 
     cropIntent.setDataAndType(selectedImage, "image/*"); 
     //set crop properties 
     cropIntent.putExtra("crop", "true"); 
     //indicate aspect of desired crop 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     //indicate output X and Y 
     cropIntent.putExtra("outputX", 640); 
     cropIntent.putExtra("outputY", 640); 
     //retrieve data on return 
     cropIntent.putExtra("return-data", true); 
     //start the activity - we handle returning in onActivityResult 
     startActivityForResult(cropIntent, PIC_CROP); 
    } 
    catch(ActivityNotFoundException anfe){ 
     //display an error message 
     String errorMessage = "Whoops - your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
} 

Questa parte del codice è quello youøre interessati a:

 cropIntent.putExtra("outputX", 640); 
     cropIntent.putExtra("outputY", 640); 

Si dovrebbe chiamare il metodo delle colture in questo modo:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA && resultCode == RESULT_OK) { 

     selectedImage = data.getData(); 
     performCrop(); 

    } 

    if (requestCode == UPLOAD && resultCode == RESULT_OK) { 
     selectedImage = data.getData(); 
     performCrop(); 
    } 

    if (requestCode == PIC_CROP && resultCode == RESULT_OK){ 
     Bundle extras = data.getExtras(); 
     //get the cropped bitmap 
     Bitmap thePic = extras.getParcelable("data"); 

     // Do what you want to do with the pic here 
    } 



} 
+0

Ma questo non aggiusta la finestra di ritaglio. Sarebbe comunque ridimensionabile. – toobsco42

+0

quello che se si gioca in giro con .putExtra ("scala", true) .putExtra ("scaleUpIfNeeded", true) Prova vero/falso varianti – SteBra

+0

ho provato anche questo SteBra, ma senza fortuna. – toobsco42

14

Userei una di queste soluzioni:

  1. https://github.com/jdamcd/android-crop
  2. https://github.com/edmodo/cropper

Entrambi sembra essere appropriata per risolvere il problema e di sicuro coprire più casi limite, i dispositivi e altre cose Android solo per essere più stabile e affidabile.

EDIT:
ho introdotto alcune modifiche al android-crop e ora è possibile utilizzare withFixedSize(int width, int height) per impostare area di ritaglio fissa in pixel.

appare come questa

private void beginCrop(Uri source) { 
     Uri outputUri = Uri.fromFile(new File(getCacheDir(), "cropped")); 
     new Crop(source).output(outputUri).withFixedSize(640, 640).start(this); 
    } 

Qui si tratta di un codice completo pull request.

Controllare il mio github https://github.com/mklimek/android-crop/tree/newfeature_fied_size_crop.

È possibile clonare la build e aggiungerla successivamente al progetto.

Spero che ti possa aiutare.

+0

Ho provato anche queste due librerie, ma nessuno dei due ha una finestra di ritaglio fissa. – toobsco42

+3

@ toobsco42 Ho modificato la mia risposta e penso che risolverà il tuo problema. – mklimek

+0

@ toobsco42 la mia soluzione funziona come previsto? – mklimek

Problemi correlati