2014-10-08 14 views
12

Làm cách nào để cắt hình ảnh hình chữ nhật (600 x 300) từ trái sang phải để vừa với ImageView vuông? Tôi không muốn thay đổi kích thước hình ảnh, tôi chỉ muốn cắt nó, là 300 x 300.Cắt ảnh thành hình vuông - Android

[SOLUTION]

Như @blackbelt nói

Bitmap cropImg = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight);

là rất tốt để cắt ảnh. Vì vậy, làm thế nào bạn có thể tự động cắt hình ảnh với kích cỡ khác nhau. Tôi tạo mã đơn giản này cho rằng:

// From drawable 
Bitmap src= BitmapFactory.decodeResource(context.getResources(), R.drawable.image); 

// From URL 
Bitmap src = null; 
try { 
    String URL = "http://www.example.com/image.jpg"; 
    InputStream in = new java.net.URL(URL).openStream(); 
    src = BitmapFactory.decodeStream(in); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

int width = src.getWidth(); 
int height = src.getHeight(); 
int crop = (width - height)/2; 
Bitmap cropImg = Bitmap.createBitmap(src, crop, 0, height, height); 

ImageView.setImageBitmap(cropImg); 

Trả lời

3

Bạn có thể sử dụng

Bitmap dst = Bitmap.createBitmap(src, startX, startY, dstWidth, dstHeight); 

từ các tài liệu:

Trả về một bitmap bất biến từ nhóm quy định của nguồn bitmap. Bitmap mới có thể là đối tượng giống như nguồn, hoặc một bản sao có thể đã được thực hiện. Nó được khởi tạo với mật độ giống như bitmap gốc.

Here bạn có thể tìm thấy tài liệu

16

Mở rộng một chút về câu trả lời ở trên

Vì trong một số trường hợp, bạn có thể kết thúc với một ngoại lệ hoặc không phải là dự kiến kết quả, chỉ bằng cách sử dụng bitmap.createBitmap(), giống như fallowing:

java.lang.IllegalArgumentException: x + chiều rộng phải < = bitmap.width()

Heres là một chức năng nhỏ mà không được cây trồng và xử lý một số trường hợp commons.

Chỉnh sửa: cập nhật theo đúng yêu cầu của droidster.

public static Bitmap cropToSquare(Bitmap bitmap){ 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    int newWidth = (height > width) ? width : height; 
    int newHeight = (height > width)? height - (height - width) : height; 
    int cropW = (width - height)/2; 
    cropW = (cropW < 0)? 0: cropW; 
    int cropH = (height - width)/2; 
    cropH = (cropH < 0)? 0: cropH; 
    Bitmap cropImg = Bitmap.createBitmap(bitmap, cropW, cropH, newWidth, newHeight); 

    return cropImg; 
} 

Tôi đã thực hiện một số thử nghiệm với một số hình ảnh có độ phân giải và kích thước khác nhau và hoạt động như mong đợi.

Nó cũng có thể được sử dụng trong các tình huống khác, ví dụ như khi bạn đang cố gắng tạo một hình ảnh tròn "hoàn hảo" và cần truyền một bitmap vuông vức, v.v.

+1

Đây chính là điều tôi đang tìm kiếm, để có được hình ảnh tròn hoàn hảo và không hình bầu dục. Tuy nhiên, nếu chiều cao của hình ảnh lớn hơn chiều rộng, không cắt ở giữa vì giá trị của y param là 0 trong phương thức createBitmap. Đây là cách có thể sửa được: Thêm 2 dòng sau: 'int cropH = (height - width)/2; \t cropH = (cropH <0)? 0: cropH; 'Sử dụng cropH làm giá trị y. \t 'Bitmap cropImg = Bitmap.createBitmap (bitmap, cropW, cropH, newWidth, newHeight);' –

+0

Tốt, tôi thấy điểm của bạn .... Về cơ bản để thực hiện các phép tính tương tự cho cả Chiều rộng và Chiều cao. –

1

đặt chế độ xem hình ảnh cố định chiều cao, chiều rộng, và thiết lập hai thuộc tính để xem hình ảnh

android:adjustViewBounds="true" 
android:scaleType="centerCrop" 

làm

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