2011-12-05 30 views
8

Tôi muốn sử dụng xem trước máy ảnh để nhận dạng hình ảnh. Đối với mục đích của tôi, tôi cần độ phân giải xem trước càng cao càng tốt (và, đồng thời, hiển thị xem trước cho người dùng).Làm thế nào để có được dữ liệu xem trước máy ảnh Android 720p?

Tôi đã tạo lớp Xem trước, mở rộng SurfaceView và đặt PreviewSize thành 1280x720. Tôi đã thêm một PreviewCallBack để có được sống Ảnh:

camera = Camera.open(); 

parameters = camera.getParameters(); 
parameters.setPreviewSize(1280,720); 

camera.setParameters(parameters); 
byte[] b = new byte[camera.getParameters().getPreviewSize().width * 
    camera.getParameters().getPreviewSize().height * 
    ImageFormat.getBitsPerPixel(camera.getParameters().getPreviewFormat())/8]; 
camera.addCallbackBuffer(b); 
camera.setPreviewCallbackWithBuffer(new CameraPreviewCallback()); 

try { 
camera.setPreviewDisplay(this.getHolder()); 
camera.startPreview() 
} 

My Byte mảng b là 1.382.400 Byte và CameraPreviewCallback.onPreviewFrame() chức năng của tôi nhận được những 1.382.400 Bytes - nhưng chỉ có 497.664 Byte đầu tiên chứa dữ liệu (khớp a Độ phân giải 768x432 (HTC Desire)).

Tôi đã thử nghiệm điều này trên các thiết bị khác nhau, tất cả đều có độ phân giải màn hình 800x480 (HTC Desire, LG Optimus 3D, Samsung Galaxy S2, Samsung Galaxy Tab, ...). Thiết bị duy nhất mà Code của tôi hoạt động là HTC Desire HD.

Có ai biết cách nhận độ phân giải 720p đầy đủ dưới dạng Byte Array không? "Cái gì đó" dường như giảm độ phân giải xem trước để vừa với màn hình điện thoại thông minh.

Trân

Joern

+0

Bạn có chắc chắn rằng điện thoại của mình hỗ trợ 720p không? Logcat có nói bất cứ điều gì (như "không thể thiết lập độ phân giải") không? – Lennart

+0

Đúng, 720p được hỗ trợ trên tất cả các thiết bị dưới dạng kích thước xem trước. Logcat không nói bất cứ điều gì đặc biệt - có vẻ như "cái gì đó" làm giảm độ phân giải xem trước âm thầm. –

+0

Liệu getPreviewSize() có trả lại kích thước chính xác không? – Lennart

Trả lời

8

Bạn không thể sử dụng bất kỳ độ phân giải ngẫu nhiên cho một bản xem trước camera.

Một số thiết bị chỉ hỗ trợ các độ phân giải nhất định. Bạn có thể truy vấn chúng qua Camera.Parameters.getSupportedPreviewSizes() ¹. Nếu thiết bị của bạn không trả lại 1280x720 trong danh sách này, bạn không thể sử dụng thiết bị. Chọn độ phân giải được hỗ trợ gần với độ phân giải mong muốn của bạn.

¹ Bạn nên làm như vậy nói chung trước khi sử dụng bất kỳ độ phân giải, độ phân giải 720p hay không

+2

(Thật không may) 1280x720p nằm trong danh sách của mọi thiết bị được liệt kê. Tôi đã kiểm tra SupportedPreviewSizes. –

2

Mặc dù đây là một câu hỏi cũ, câu trả lời là không thay đổi: danh sách các kích thước xem trước hỗ trợ cho mỗi thiết bị là không chính xác. Kích thước xem trước mặc định là, theo sự hiểu biết tốt nhất của tôi, luôn hợp lệ. Các kích thước khác dường như hoạt động tối đa trên cơ sở từng trường hợp - bạn có thể tự tin hợp lý rằng kích thước xem trước mặc định sẽ không hiển thị không chính xác trên màn hình, nhưng đó là tất cả. Đặc biệt, Byte Array sẽ không mở rộng để chứa các định dạng hình ảnh lớn hơn ngay cả khi chúng được "hỗ trợ" và chỉ một số kích thước xem trước "được hỗ trợ" sẽ được hiển thị ở độ phân giải và không bị biến dạng xanh/hồng.

Cách duy nhất đáng tin cậy để biết rằng độ phân giải là chính xác và dữ liệu từ onPreviewFrame() là tốt là để kiểm tra điều này theo cách thủ công.

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