2010-10-02 93 views
32

thể trùng lặp:
How to crop the parsed image in android?Làm thế nào để cắt một hình ảnh trong Android?

Tôi có một hình ảnh trong res/thư mục drawable của tôi và tôi muốn cắt (tức là cắt ra một số phần của hình ảnh) hình ảnh khi tải nó vào một ImageView. Tuy nhiên tôi không chắc chắn làm thế nào để làm điều này, bất cứ đề nghị?

+0

Câu hỏi được liên kết trả lời không trả lời cách cắt, vui lòng đọc. – m0skit0

Trả lời

6

Nếu bạn muốn cắt không kém bên ngoài của hình ảnh, bạn nên kiểm tra các thuộc tính ScaleType cho một ImageView: http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

Đặc biệt, bạn sẽ quan tâm đến tùy chọn "centerCrop". Nó cắt ra một phần của hình ảnh lớn hơn kích thước được xác định.

Dưới đây là một ví dụ để làm điều này trong cách bố trí XML:

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

thật ngớ ngẩn của chúng, chúng không thêm nhiều tùy chọn cây trồng nữa, sau đó cắt trung tâm ... –

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

Bạn đặt đường dẫn đến "rectf" trực tuyến, nhưng không xác định nó. Làm thế nào để bạn tính toán kích thước của clipping rect để đúng clip trung tâm của bitmap? I E. không kẹp từ góc ra. – MarkPowell

+0

Cách tiếp cận để sử dụng Bitmap.createBitmap có hình ảnh nguồn sẽ hiệu quả hơn rất nhiều trừ khi bạn cần chỉnh sửa bitmap thêm. Vì nó tạo ra một bitmap không thay đổi, nó không phải tạo một bản sao. (trừ khi nguồn có thể thay đổi) –

+0

rectf là gì? vui lòng trả lời –

13

Android quản lý Liên EditContactActivity sử dụng Intent("com.android.camera.action.CROP")

Đây là một mẫu mã:

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

Nếu tôi có hình ảnh tại Thẻ SD/myimage.jpg, Làm cách nào tôi có thể đặt URI vào ý định CROP ? I E. Tôi muốn cắt một khu vực của hình ảnh SD Card/myimage.jpg. –

+0

#Nguyen, hãy cho bạn những gì bạn nhận xét. –

+0

bạn có * ... –

7

Thử này:

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

Từ Documents:

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

Trả về một bitmap bất biến từ nhóm quy định của bitmap nguồn.

+0

Tốt! Vẫn còn ngớ ngẩn, nó không thể được thực hiện với một thuộc tính đơn giản trên ImageView mặc dù, nhưng tôi đoán điều này sẽ đủ hiệu quả. –

33

Từ Bitmap.createBitmap: "Trả lại bitmap bất biến từ tập con được chỉ định của bitmap nguồn. Bitmap mới có thể là cùng một đối tượng như nguồn hoặc bản sao có thể đã được tạo. bitmap gốc. "

Vượt qua một bitmap và xác định hình chữ nhật mà từ đó bitmap mới sẽ được tạo.

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

Đối với tôi, nó chỉ hoạt động nếu tôi đã làm 'originalBmp.getWidth() - 1'. Có vẻ như tất cả các kích thước cây trồng phải rơi hoàn toàn bên trong bản gốc nếu không bản gốc được trả về. –

Các vấn đề liên quan