2012-06-11 31 views
7

Tôi cần gửi hình ảnh qua kết nối băng thông thấp rất từ điện thoại Android (xuống tới 10kByte/s) và muốn gửi chúng ở chế độ liên tục (xen kẽ) rằng người dùng ở đầu bên kia bắt đầu thấy hình ảnh đã có trong quá trình truyền kéo dài. Ngay bây giờ, tôi đang tạo ra những hình ảnh với các ứng dụng hình ảnh thường xuyên:Cách tạo hình ảnh JPEG lũy tiến trên Android

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

Nhưng điều này tạo ra phi tiến ảnh và tôi đã không thể phát hiện ra làm thế nào để thuyết phục nó để làm ngược lại. Lựa chọn thứ hai tôi khám phá (đọc và tái nén hình ảnh chụp) đã thất bại bởi vì phương pháp nén của Bitmap không cho phép bất kỳ thông số mã hóa bên cạnh tên định dạng và yếu tố nén như xa như tôi có thể xác định:

bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);

Giải pháp ưa thích của tôi là hướng dẫn ứng dụng ảnh lưu ở chế độ tiến bộ.

Tùy chọn tốt nhất tiếp theo sẽ là một thuật toán Java không chuyển đổi jpeg được lưu trữ thành lũy tiến (jpegtran thực hiện điều này trên Linux, nhưng nó nằm trong C và dựa trên libjepeg).

Tốt nhất tiếp theo sẽ là phương pháp để chỉ định các thông số mã hóa có liên quan cho android cho phép tôi nén lại hoặc thư viện Java thay thế thực hiện tương tự.

Nghiên cứu sâu hơn cho thấy các thuật toán đã có (/system/lib/libjpeg.so) với các nguồn trong ~/android-sdk-linux/source-tree/external/jpeg - nhưng dường như không có trình bao bọc JNI sẵn có.

+1

Chỉ cần lưu ý: "tiến bộ" là chính xác những gì bạn nhận được: từ trên xuống dưới. Những gì bạn đang tìm kiếm được gọi là "xen kẽ". Định dạng đầu ra JPEG không hỗ trợ xen kẽ. PNG có, vì vậy bạn cần xem xét việc tạo hình ảnh PNG đan xen. –

+1

@AleksG Xin lỗi, nhưng tôi không đồng ý. Vui lòng xem phần [wikipedia] (https://en.wikipedia.org/wiki/JPEG) 'JPEG compression'. Như tôi đã đề cập trong câu hỏi, định dạng này dễ tạo trên 'Linux' bằng cách sử dụng jpegtran. – Ivin

Trả lời

1

Bạn đã xem tài liệu này chưa?

http://docs.oracle.com/javase/6/docs/api/javax/imageio/plugins/jpeg/JPEGImageWriteParam.html

Nó dường như có hỗ trợ tiến bộ ghi.

Hoặc, bạn có thể sử dụng ví dụ: OpenJPEG thông qua JNI. Xem http://www.linux-mag.com/id/7697/ để bắt đầu.

+0

Cảm ơn bạn đã đề xuất, nhưng tôi cần giải pháp trong Android và JPEGImageWriteParam không khả dụng ở đó. Sử dụng libjpeg (Openjpeg) trực tiếp tôi chỉ không có cơ hội để làm việc trên. – Ivin

+0

Tôi hiểu rồi. Nhưng nguồn JDK có sẵn, và có lẽ bạn có thể tái sử dụng các nguồn đó? – TFuto

+0

Chúng có sẵn và tôi đã thử - nhưng nếu bạn cố kéo chức năng đó qua, bạn đang kéo vài chục lớp cùng với ti. Hầu hết các gói trong khu vực này không được Android hỗ trợ. – Ivin

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