2011-12-28 38 views
6

Từ thử nghiệm và đọc các bài đăng khác like this one có vẻ như khó xử lý hình ảnh có độ phân giải cao trên Android vì có giới hạn về số lượng bộ nhớ mà VM cho phép phân bổ.Xử lý hình ảnh có độ phân giải cao Android

Tải ảnh máy ảnh 8MP mất khoảng 20 MB bộ nhớ.

Tôi hiểu rằng giải pháp dễ dàng là downsample hình ảnh khi tải nó (BitmapFactory cung cấp tùy chọn này) nhưng tôi vẫn muốn xử lý hình ảnh ở độ phân giải đầy đủ: camera quay 8MP, tại sao tôi chỉ sử dụng 4MP và giảm chất lượng.

Có ai biết giải pháp tốt cho điều đó không?

Trả lời

1

2 điều:

  1. Thanh toán gallery ở Honeycomb. Nó thực hiện điều này dựa trên lát gạch. Bạn có thể phóng to trên một hình ảnh và bạn thấy sau đó phần hiện tại là cao hơn res sau đó các phần khác. Nếu bạn xoay quanh, bạn sẽ thấy nó hiển thị.

  2. Khi sử dụng mã gốc (NDK), không có giới hạn tài nguyên. Vì vậy, bạn có thể cố gắng tải tất cả các dữ liệu bản địa và bằng cách nào đó có được một phần của nó bằng cách sử dụng JNI, nhưng tôi nghi ngờ nó tốt hơn sau đó các bộ sưu tập của honeycom.

+0

Về 1. BitmapFactory thực sự được thiết kế để làm những việc như thế: chỉ tải vùng, tải ở độ phân giải thấp hơn. Việc tải vùng có thể hữu ích để đạt được ốp lát như @ paul-sasik gợi ý. – Kamchatka

+0

Về 2. các giới hạn tương tự áp dụng cho mã gốc. Tôi nhận được bản thân mình với lỗi OutOfMemory bản địa hiển thị mọi thứ. –

2

Trong môi trường hạn chế tài nguyên, tôi nghĩ giải pháp duy nhất của bạn là chia và chinh phục: ví dụ: caching/tiling (như in: tiles)

Thay vì tải và xử lý hình ảnh cùng một lúc bạn tải/lưu các đoạn có thể quản lý của hình ảnh từ một tệp dữ liệu thô để xử lý. Đây không phải là tầm thường và có thể thực sự phức tạp tùy thuộc vào loại xử lý bạn muốn làm, nhưng đó là cách duy nhất nếu bạn không muốn đưa vào chất lượng hình ảnh.

+0

Tôi đã nghĩ đến việc ốp lát. Nó làm cho việc xử lý hình ảnh phức tạp hơn một chút nhưng nhược điểm chính là ở phần cuối, tôi cần phải xây dựng lại tệp cuối cùng mà có thể từ rất nhiều tệp tạm thời. Đó có thể là doable nhưng rất nặng. – Kamchatka

+0

Nếu kích thước hình ảnh của bạn không thay đổi trong quá trình xử lý thì bạn sẽ không cần tệp tạm thời. Bạn có thể viết các phần/lát được xử lý thành các phần thích hợp của tệp hình ảnh. –

+0

Phải. Tôi sợ thời gian xử lý thực sự xấu với tất cả các IO. Bất cứ ý tưởng bao nhiêu chậm hơn là để ghi vào bộ nhớ flash so với RAM điện thoại? – Kamchatka

2

Thật vậy, điều này thật khó. Nhưng trong trường hợp hình ảnh ở định dạng raster liên tục, bạn có thể mmap nó (xem java.nio.ByteBuffer) - bằng cách này bạn nhận được bộ đệm byte mà không cần phân bổ nó.

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