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;
fonte
2017-06-14 08:46:12
Date un'occhiata a questo tutorial: http://mobile.tutsplus.com/tutorials/android/capture-and-crop-an-image-with-the- dispositivo-camera/ –
@DmytroDanylyk grazie per la vostra risposta ... fatemi controllare !! –
@DmytroDanylyk è anche la stessa cosa .. intent.setData (bitmap); non funziona –