2013-03-10 31 views
7

Tôi đang tạo một ứng dụng Android và tôi cần tải một hình ảnh (bitmap) trong một cavas và thay đổi kích thước bằng cách sử dụng cử chỉ "thu nhỏ". Tuy nhiên, khi hình ảnh trên một kích thước nhất định, ứng dụng bị treo (ngoại lệ OutOfMemory). Làm cách nào để tối ưu hóa tải và thao tác của hình ảnh?Tải Android các ảnh bitmap lớn

Để tải hình ảnh tôi sử dụng:

BitmapFactory.decodeResource (ctx.getResources(), R.drawable.image) 

Để vẽ nó:

imgCanvas.drawBitmap (image, posX, posY, null), 

Để thay đổi kích thước của nó:

Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true); 

Trả lời

3

Đây không phải là tầm thường.

Dựa trên quy mô hiện tại của hình ảnh và phần hiện thời hiển thị của hình ảnh, chỉ tải một phần của hình ảnh đó ở độ phân giải thích hợp:
https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

Khi thu nhỏ và bạn muốn hiển thị toàn bộ hình ảnh thu nhỏ lại, sử dụng phương pháp từ lớp BitmapRegionDecoder này mà phải mất một tham số BitmapFactory.Options và đặt nó inSampleSize đến một giá trị lớn hơn 1 (tốt hơn là một giá trị đó là một sức mạnh của 2):
https://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

Khi phóng to, zoom đầu tiên độ phân giải thấp hơn đã được hiển thị (nơi bạn đã sử dụng giá trị inSampleSize> 1) và tải một cách nhẹ nhàng phiên bản có độ phân giải cao hơn (trong đó inSampleSize nhỏ hơn giá trị trước đó bạn đã sử dụng) bằng cách sử dụng số BitmapRegionDecoder và mờ dần dần trong phiên bản có độ phân giải cao hơn.

Khi người dùng phóng to, tiếp tục làm cho đến khi inSampleSize của bạn là 1.

+0

ban đầu tôi tải hình ảnh với kích thước ban đầu của nó (với inSampleSize = 1). Khi tôi tạo "phóng to", tôi phải thay đổi inSampleSize bằng một giá trị> 1 và sau đó cắt hình ảnh? – Giammy

+0

Trước khi người dùng phóng to, bạn tải toàn bộ hình ảnh của mình bằng inSampleSize> 1. Sau đó, khi người dùng phóng to, tại các điểm nhất định, bạn sẽ tải lại hình ảnh, nhưng chỉ một phần của nó và với inSampleSize có giá trị thấp hơn (nhưng vẫn còn hơn 1). Khi người dùng phóng to lại lần nữa, tại một số điểm, inSampleSize = 1 của bạn (và bạn sẽ chỉ tải phần hiển thị). –

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