2010-10-02 7 views
32

Можно создать дубликат:
How to crop the parsed image in android?Как обрезать изображение в Android?

У меня есть изображение в моем Рез/вытяжке папку, и я хотел бы, чтобы обрезать (т.е. нарезать некоторую часть изображения) изображения при погрузке это в ImageView. Однако я не уверен, как это сделать, любые предложения?

+0

Связанный вопрос ответ не отвечает, как урожай, прочитайте его. – m0skit0

ответ

6

Если вы хотите, чтобы одинаково обрезать снаружи изображения, вы должны проверить атрибут ScaleType для ImageView: http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

В частности, вы были бы заинтересованы в опции «centerCrop». Он отображает часть изображения, которое больше заданного размера.

Вот пример выполнения этого в макете XML:

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

его так глупо, что они не добавили больше возможностей обрезки, а затем посередине ... –

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

Вы устанавливаете путь к прямому прямоугольнику, но не определяете его. Как вы вычисляете размеры вырезающего прямоугольника, чтобы правильно закрепить центр растрового изображения? То есть не клип из угла. – MarkPowell

+0

Подход к использованию Bitmap.createBitmap, который принимает исходное изображение, должен быть намного более эффективным, если вам не нужно дополнительно модифицировать растровое изображение. Поскольку он создает неизменяемое растровое изображение, ему не нужно делать копию. (если источник не изменен) –

+0

что такое rectf? ответьте –

13

андроида Связаться с менеджером EditContactActivity использует Intent("com.android.camera.action.CROP")

Это пример кода:

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

Если у меня есть изображение на SD-карте/myimage.jpg, как я могу поместить URI в цель CROP ? то есть. Я хочу обрезать область изображения SD Card/myimage.jpg. –

+0

#Nguyen, у вас есть то, что вы прокомментировали. –

+0

у вас есть * ... –

7

Try это:

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

Из Документов:

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

Возвращает неизменяемое растровое изображение из указанного подмножества исходного растрового изображения.

+0

Ницца! Тем не менее, глупо это не может быть сделано с помощью простого атрибута в ImageView, но, я думаю, это должно быть достаточно эффективным. –

33

От Bitmap.createBitmap: «Возвращает неизменяемую растрового изображения из указанного подмножества исходного растрового изображения нового растрового изображения может быть тот же объект в качестве источника, или копия может быть сделана Он инициализируется с той же плотностью, что и.. оригинальное растровое изображение. "

Пропустите его растровое изображение и определите прямоугольник, из которого будет создано новое растровое изображение.

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

Для меня это работало только, если я сделал 'originalBmp.getWidth() - 1'. Похоже, что все размеры урожая должны полностью падать внутри оригинала, иначе возвращается оригинал. –

Смежные вопросы