2010-10-02 23 views

risposta

6

Se si desidera ritagliare ugualmente l'esterno dell'immagine, si dovrebbe verificare l'attributo ScaleType per un ImageView: http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

In particolare, si sarebbe interessato nell'opzione "centerCrop". Ritaglia una parte dell'immagine che è più grande della dimensione definita.

Ecco un esempio di fare questo nel layout XML:

<ImageView android:id="@+id/title_logo" 
      android:src="@drawable/logo" 
      android:scaleType="centerCrop" android:padding="4dip"/> 
+0

è così stupido che non hanno aggiunto più opzioni di ritaglio quindi centrano il ritaglio ... –

3
int targetWidth = 100; 
int targetHeight = 100; 
RectF rectf = new RectF(0, 0, 100, 100);//was missing before update 
Bitmap targetBitmap = Bitmap.createBitmap(
targetWidth, targetHeight,Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(targetBitmap); 
Path path = new Path(); 
path.addRect(rectf, Path.Direction.CW); 
canvas.clipPath(path); 
canvas.drawBitmap(
sourceBitmap, 
new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()), 
new Rect(0, 0, targetWidth, targetHeight), 
null); 
ImageView imageView = (ImageView)findViewById(R.id.my_image_view); 
imageView.setImageBitmap(targetBitmap); 
+1

Imposta il percorso del file "rectf", ma non definirlo. Come calcoli le dimensioni del rect di ritaglio per ritagliare correttamente il centro della bitmap? Cioè non tagliare dall'angolo. – MarkPowell

+0

L'approccio per utilizzare Bitmap.createBitmap che prende un'immagine sorgente dovrebbe essere molto più efficiente a meno che non sia necessario modificare ulteriormente la bitmap. Dal momento che crea una bitmap immutabile, non deve fare una copia. (a meno che la fonte non sia modificabile) –

+0

cos'è rectf? per favore rispondi –

13

Contact Manager Android EditContactActivity utilizza Intent("com.android.camera.action.CROP")

Si tratta di un codice di esempio:

Intent intent = new Intent("com.android.camera.action.CROP"); 
// this will open all images in the Galery 
intent.setDataAndType(photoUri, "image/*"); 
intent.putExtra("crop", "true"); 
// this defines the aspect ration 
intent.putExtra("aspectX", aspectY); 
intent.putExtra("aspectY", aspectX); 
// this defines the output bitmap size 
intent.putExtra("outputX", sizeX); 
intent.putExtra("outputY", xizeY); 
// true to return a Bitmap, false to directly save the cropped iamge 
intent.putExtra("return-data", false); 
//save output image in uri 
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
+1

Se ho un'immagine su scheda SD/myimage.jpg, come posso inserire l'URI in Intento CROP ? vale a dire. Voglio ritagliare una regione di immagine SD Card/myimage.jpg. –

+0

# Nguyen, hai ciò che hai commentato. –

+0

hai * ... –

7

Try questo:

ImageView ivPeakOver=(ImageView) findViewById(R.id.yourImageViewID); 

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.yourImageID); 
int width=(int)(bmp.getWidth()*peakPercent/100); 
int height=bmp.getHeight(); 

Bitmap resizedbitmap=Bitmap.createBitmap(bmp,0,0, width, height); 
ivPeakOver.setImageBitmap(resizedbitmap); 

dalla documentazione:

static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height) 

Restituisce una bitmap immutabile dal sottoinsieme specificato del bitmap di origine.

+0

Bello! Ancora sciocco non può essere fatto con un semplice attributo su ImageView, ma suppongo che questo dovrebbe essere abbastanza efficiente. –

33

Da Bitmap.createBitmap: "restituisce un bitmap immutabile dal sottoinsieme delle bitmap di origine La nuova bitmap può essere lo stesso oggetto come sorgente, o una copia può essere stata fatta 'inizializzato con la stessa densità del.. bitmap originale. "

Passare una bitmap e definire il rettangolo da cui verrà creata la nuova bitmap.

// Take 10 pixels off the bottom of a Bitmap 
Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, 0, 0, originalBmp.getWidth(), originalBmp.getHeight()-10); 
+1

Per me ha funzionato solo se ho fatto 'originalBmp.getWidth() - 1'. Sembra che tutte le dimensioni del raccolto debbano cadere completamente all'interno dell'originale, altrimenti l'originale viene restituito. –

Problemi correlati