2013-04-03 13 views
34

Come posso ritagliare un'immagine bitmap? questa è la mia domanda Ho provato alcuni concetti usando intents ma ancora fallisco ..Ritaglia un'immagine bitmap

Sto avendo un'immagine bitmap che voglio ritagliare !!

ecco il codice:

Intent intent = new Intent("com.android.camera.action.CROP"); 
         intent.setClassName("com.android.camera", "com.android.camera.CropImage"); 
         File file = new File(filePath); 
         Uri uri = Uri.fromFile(file); 
         intent.setData(uri); 
         intent.putExtra("crop", "true"); 
         intent.putExtra("aspectX", 1); 
         intent.putExtra("aspectY", 1); 
         intent.putExtra("outputX", 96); 
         intent.putExtra("outputY", 96); 
         intent.putExtra("noFaceDetection", true); 
         intent.putExtra("return-data", true);         
         startActivityForResult(intent, REQUEST_CROP_ICON); 

Qualcuno mi potrebbe aiutare per quanto riguarda questo @Thanks

+0

Date un'occhiata a questo tutorial: http://mobile.tutsplus.com/tutorials/android/capture-and-crop-an-image-with-the- dispositivo-camera/ –

+0

@DmytroDanylyk grazie per la vostra risposta ... fatemi controllare !! –

+0

@DmytroDanylyk è anche la stessa cosa .. intent.setData (bitmap); non funziona –

risposta

92

Ho usato questo metodo per ritagliare l'immagine e funziona perfetto:

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.xyz); 

resizedbitmap1=Bitmap.createBitmap(bmp, 0,0,yourwidth, yourheight); 

CreateBitmap () accetta bitmap, avvia X, avvia Y, larghezza & altezza come parametro

+0

sankettt che dire della tua larghezza, della tua altezza; potresti spiegare in breve –

+0

sankettt in qualsiasi modo grazie –

+1

@ priya2134412 sicuro. è la larghezza e l'altezza della quantità di bitmap che vuoi ritagliare.i.e la parte che vuoi tagliare – sankettt

11

Utilizzare la risposta sopra non funziona se si desidera tagliare/ritagliare aree particolari fuori limite! Usando questo codice otterrete sempre le dimensioni desiderate, anche se la fonte è più piccola.

// Here I want to slice a piece "out of bounds" starting at -50, -25 
// Given an endposition of 150, 75 you will get a result of 200x100px 
Rect rect = new Rect(-50, -25, 150, 75); 
// Be sure that there is at least 1px to slice. 
assert(rect.left < rect.right && rect.top < rect.bottom); 
// Create our resulting image (150--50),(75--25) = 200x100px 
Bitmap resultBmp = Bitmap.createBitmap(rect.right-rect.left, rect.bottom-rect.top, Bitmap.Config.ARGB_8888); 
// draw source bitmap into resulting image at given position: 
new Canvas(resultBmp).drawBitmap(bmp, -rect.left, -rect.top, null); 

... e il gioco è fatto!

1

Ho avuto un problema simile con il ritaglio e dopo aver provato numerosi approcci ho capito che questo aveva senso per me. Questo metodo ritaglia solo l'immagine a forma quadrata, sto ancora lavorando sulla forma circolare (Sentiti libero di modificare il codice per ottenere la forma che ti serve).

Quindi, prima devi bitmap yout che si desidera ritagliare:

informazioni
Bitmap image; //you need to initialize it in your code first of course 

L'immagine viene memorizzata in un [] array int ciò che non è altro che un array di interi contenenti il ​​valore del colore di ogni pixel, iniziando dall'angolo in alto a sinistra dell'immagine con indice 0 e finendo nell'angolo in basso a destra con indice N. È possibile ottenere questo array con il metodo Bitmap.getPixels() che accetta vari argomenti.

Abbiamo bisogno della forma quadrata, quindi abbiamo bisogno di accorciare i lati più lunghi. Inoltre, per mantenere l'immagine centrata, il ritaglio deve essere eseguito su entrambi i lati dell'immagine. Spero che l'immagine ti aiuti a capire cosa intendo. Visual representation of the cropping. I punti rossi nell'immagine rappresentano i pixel iniziale e finale di cui abbiamo bisogno e la variabile con il trattino è numericamente uguale alla stessa variabile senza il trattino.

Ora finalmente il codice:

int imageHeight = image.getHeight(); //get original image height 
int imageWidth = image.getWidth(); //get original image width 
int offset = 0; 

int shorterSide = imageWidth < imageHeight ? imageWidth : imageHeight; 
int longerSide = imageWidth < imageHeight ? imageHeight : imageWidth; 
boolean portrait = imageWidth < imageHeight ? true : false; //find out the image orientation 
//number array positions to allocate for one row of the pixels (+ some blanks - explained in the Bitmap.getPixels() documentation) 
int stride = shorterSide + 1; 
int lengthToCrop = (longerSide - shorterSide)/2; //number of pixel to remove from each side 
//size of the array to hold the pixels (amount of pixels) + (amount of strides after every line) 
int pixelArraySize = (shorterSide * shorterSide) + (shorterImageDimension * 1); 
int pixels = new int[pixelArraySize]; 

//now fill the pixels with the selected range 
image.getPixels(pixels, 0, stride, portrait ? 0 : lengthToCrop, portrait ? lengthToCrop : 0, shorterSide, shorterSide); 

//save memory 
image.recycle(); 

//create new bitmap to contain the cropped pixels 
Bitmap croppedBitmap = Bitmap.createBitmap(shorterSide, shorterSide, Bitmap.Config.ARGB_4444); 
croppedBitmap.setPixels(pixels, offset, 0, 0, shorterSide, shorterSide); 

//I'd recommend to perform these kind of operations on worker thread 
listener.imageCropped(croppedBitmap); 

//Or if you like to live dangerously 
return croppedBitmap;