2010-03-25 38 views
16

Tôi muốn vẽ một bitmap trên canvas có kích thước lớn hơn nó. Tôi có thể sử dụng canvas.drawBitmap (bitmap, null, destRect, null); nhưng điều đó mang lại chất lượng kém, vì kết quả là pixelated, nếu hình ảnh nguồn trông nhỏ hơn hình chữ nhật đích.Cách vẽ và chia tỷ lệ bitmap trên canvas bằng cách sử dụng nội suy bicubic trong Android?

Làm cách nào tôi có thể vẽ bitmap của mình bằng cách lấy lại mẫu song song hoặc bicubic?

Bất kỳ trợ giúp nào sẽ được đánh giá cao, thanx.

Trả lời

34

Bạn cần đặt cờ FILTER_BITMAP_FLAG trong sơn của mình.

canvas.drawBitmap(bitmap, matrix, null); //ugly jaggies unless scale is 1:1, but fast 

hoặc

Paint paint = new Paint(); 
paint.setFilterBitmap(); 
canvas.drawBitmap(bitmap, matrix, paint); // pretty but slower (not too slow, usually) 

cũng áp dụng cho những người khác (đường cú pháp) hình thức của phương pháp drawBitmap.

Không có tài liệu nào ở bất kỳ đâu cho hầu hết các tùy chọn vẽ Android và không có tài liệu nào cho thư viện gốc Skia cơ bản thực hiện hiển thị. Tôi sẽ hạnh phúc hơn nếu có. Bạn có thể tìm kiếm mã nguồn Skia trên Tìm kiếm mã Google. Tìm kiếm Skia và đào sâu vào nguồn thô; đó là tài liệu duy nhất.

+4

Đã phải đối phó với bây giờ điều này, nhờ chỉ ra setFilterBitmap! Chỉ cần thêm một chút thông tin từ những phát hiện của tôi, nội suy cho bộ lọc bitmap flag false là hàng xóm gần nhất và true là bilinear. Đã hy vọng bicubic có sẵn nhưng không giống như nó. – Dave

+1

paint.setFilterBitmap(); không phải là quá chậm, bởi vì hầu hết các thiết bị/api cấp đang sử dụng gpu để làm nội suy. –

+0

Hành vi tương tự chính xác, bit được cô đặc hơn: canvas.drawBitmap (bitmap, 0, 0, new Paint (Paint.FILTER_BITMAP_FLAG)); –

0

FILTER_BITMAP_FLAG không hoạt động để giảm tỷ lệ phần trăm trong hầu hết các trường hợp.

Tốt thuật toán Downscaling (người hàng xóm không gần như) bao gồm chỉ 2 bước (cộng với tính chính xác các hình chữ nhật cho vụ đầu vào/images đầu ra):

  1. downscale sử dụng BitmapFactory.Options :: inSampleSize- > BitmapFactory.decodeResource() càng gần càng tốt với độ phân giải mà bạn cần nhưng không thấp hơn nó
  2. có được độ phân giải chính xác bằng cách downscaling một chút bằng Canvas :: drawBitmap()

Dưới đây là giải thích chi tiết như thế nào SonyMobile giải quyết nhiệm vụ này: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

Đây là mã nguồn của utils quy mô SonyMobile: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/

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