web-dev-qa-db-fra.com

Recadrer une image bitmap

Comment puis-je recadrer une image bitmap? Telle est ma question. J'ai essayé quelques concepts à l'aide d'intentions mais j'échoue quand même ..

Je vais avoir une image bitmap que je veux recadrer !!

voici le code:

 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);

Quelqu'un pourrait-il m'aider à propos de cette @ Merci

49
user2134412

J'ai utilisé cette méthode pour recadrer l'image et cela fonctionne parfaitement:

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

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

createBitmap () prend un bitmap, démarre X, commence Y, largeur et hauteur en tant que paramètre

120
sankettt

Utilisation de la réponse ci-dessus ne fonctionne pas si vous souhaitez découper/rogner des zones particulières en dehors des limites! En utilisant ce code, vous obtiendrez toujours la taille souhaitée, même si la source est plus petite.

//  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);

...et tu as fini!

13
coyer

J'ai eu le même problème avec le recadrage et après avoir essayé de nombreuses approches, j'ai découvert celle-ci qui avait du sens pour moi. Cette méthode ne fait que rogner l'image à une forme carrée, je travaille toujours sur la forme circulaire (n'hésitez pas à modifier le code pour obtenir la forme dont vous avez besoin).

Donc, tout d’abord, vous avez le bitmap que vous voulez rogner:

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

Les informations sur l’image sont stockées dans un tableau int [], ce qui n’est rien de plus qu’un tableau d’entiers contenant la valeur chromatique de chaque pixel, commençant au coin supérieur gauche de l’image avec l’indice 0 et se terminant au coin inférieur droit avec l’indice N Vous pouvez obtenir ce tableau avec la méthode Bitmap.getPixels () qui prend différents arguments.

Nous avons besoin de la forme carrée, donc nous devons raccourcir les côtés les plus longs. De plus, pour que l'image reste centrée, le recadrage doit être effectué des deux côtés de l'image. J'espère que l'image vous aidera à comprendre ce que je veux dire. Représentation visuelle du recadrage. Les points rouges dans l'image représentent les pixels initiaux et finaux dont nous avons besoin et la variable avec le tiret est numériquement égale à la même variable sans le tiret.

Maintenant enfin le code:

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;
1
Peter Palka