Hiển thị kính ngắm

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG TRA TỪ ĐIỂN BẰNG CAMERA TRÊN ĐIỆN THOẠI DI ĐỘNG (Trang 27 - 29)

Sau khi mở nguồn camera thành công, ta có thể hiển thị kính ngắm. Kính ngắm có thể, nếu được hỗ trợ, truyền trực tiếp khung hình từ camera đến bộ nhớ của màn hình tại vị trí mà ứng dụng khách lựa chọn. Nếu được hỗ trợ, người phát triển

ứng dụng có thể tự hiện thực hàm hiển thị kính ngắm, trong trường hợp đó ứng dụng khách sẽ truyền ảnh từ kính ngắm dưới dạng bitmap theo các khoảng thời gian

đều đặn.

Khả năng của camera quy định cách thức hiển thị kính ngắm. Biến thành viên

iOptions của TCameraInfo có thể có một hoặc cả hai thiết lập sau:

• EviewFinderBitmapSupported – người lập trình phải tự biểu diễn kính ngắm từ những ảnh bitmap được cung cấp bởi camera.

• EviewFinderDirectSupported – các khung ảnh được truyền trực tiếp từ camera đến bộ nhớ hiển thị tại vị trí mà ứng dụng khách chọn.

Cũng có thể là camera không hỗ trợ phương pháp nào cả, vì vậy ta nên kiểm tra xem phương pháp nào được hỗ trợ trước khi cố gắng biểu diễn kính ngắm. Ta có thể chỉ rõ phần màn hình mà dữ liệu kính ngắm có thểđược truyền đến.

vKính ngắm trực tiếp

Việc biểu diễn kính ngắm trực tiếp, các khung ảnh được truyền trực tiếp từ

camera đến bộ nhớ hiển thị tại vị trí mà ứng dụng khách lựa chọn, là phương pháp hiệu quả nhất. Việc biểu diễn được thực hiện bằng hệ thống con camera (camera subsystem) và thường được tối ưu để có thể sử dụng trên bất cứ phần cứng nào. Để

vẽ kính ngắm trực tiếp, ta dùng phương thức sau:

virtual void StartViewFinderDirectL(RWsSession& aWs,

CWsScreenDevice& aScreenDevice, RWindowBase& aWindow,

TRect& aScreenRect);

Ba tham số đầu tiên có thể được lấy từ môi trường GUI (Graphical User Interface) của ứng dụng; aScreenRect là hình chữ nhật chỉ màn hình vật lý nơi

mà kính ngắm sẽđược biểu diễn. Một khi hàm StartViewFinderDirectL()

được gọi thành công, kính ngắm sẽ được hiển thị ra cho người dùng. Ứng dụng không đòi hỏi thêm một hành động nào nữa. Chú ý rằng việc truy xuất màn hình trực tiếp sẽ điều khiển vùng hiển thị của màn hình – việc mất tiêu cự không làm ngừng kính ngắm nếu nó được nhìn thấy từng phần.

Chế độ kính ngắm này có thể hiệu quả hơn chếđộ dựa trên ảnh bitmap vì nó cho phép tối ưu đường dẫn giữa phần cứng camera và trình điều khiển màn hình LCD. Tuy nhiên, cho đến gần đây, chế độ này vẫn chưa được hỗ trợ trên tất cả các thiết bị S60.

vKính ngắm dựa trên ảnh bitmap

Khi kính ngắm dựa trên ảnh bitmap được kích hoạt, camera sẽ truyền các ảnh bitmap về cho ứng dụng theo một khoảng thời gian đều đặn và ứng dụng sẽ vẽ

chúng lên màn hình khi thích hợp. Các ảnh bitmap được truyền với tốc độđủ nhanh

để có thể đảm bảo rằng sẽ hiển thị được một kính ngắm mượt. Thường thì chế độ

này không hiệu quả bằng chếđộ kính ngắm trực tiếp, nhưng nó cho phép ứng dụng khách thực hiện xử lý ảnh trong các ứng dụng thị giác máy tính hay trò chơi.

Để khởi động chế độ kính ngắm dựa trên ảnh bitmap, ta sử dụng phương thức sau:

virtual void StartViewFinderBitmapsL(TSize& aSize);

Phương thức này cần tham số có kiểu Tsize nhằm xác định kích cỡ của ảnh bitmap mà ta nhận được. Ta nên thiết lập kích cỡ này bằng với kích cỡ của vùng màn hình mà ta định vẽ kính ngắm. Các ảnh bitmap được truyền qua một trong những callback sau:

• ViewFinderReady(MCameraBuffer& aCameraBuffer, TInt aError) – phương thức này được gọi khi ta sử dụng trình quan sát

MCameraObserver2. Ảnh bitmap được trình bày bởi lớp

thể lấy ảnh có kiểu CFbsBitmap. Lớp McameraBuffer có khả năng

đóng gói nhiều khung hình đã được mã hóa; cho một kính ngắm, ta nên mong đợi một khung hình đơn, khung hình không được mã hóa dưới dạng một thể hiện của lớp CFbsBitmap.

• ViewFinderFrameReady(CFbsBitmap& aFrame) – phương thức này được gọi khi ta sử dụng trình quan sát McameraObserver. Ảnh bitmap được truyền là một thực thể của lớp CFbsBitmap, có thểđược vẽ

trên màn hình theo cách thông thường.

TRect screenRect = iAppView->Rect(); TSize size = screenRect.Size(); TCameraInfo info;

iCamera->CameraInfo(info);

if(info.iOptionsSupported & TCameraInfo::EViewFinderDirectSupported) { iCamera->StartViewFinderDirectL(iCoeEnv->WsSession(), *iCoeEnv->ScreenDevice(), *iAppView->DrawableWindow(), screenRect); }

else if (info.iOptionsSupported &

TCameraInfo::EViewFinderBitmapsSupported) {

iCamera->StartViewFinderBitmapsL(size); }

Luận văn chọn phương pháp này để hiển thị kính ngắm, tuy không hiệu quả

bằng phương pháp hiển thị trực tiếp nhưng phương pháp này cho phép người lập trình can thiệp vào những khung ảnh của kính ngắm.

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG TRA TỪ ĐIỂN BẰNG CAMERA TRÊN ĐIỆN THOẠI DI ĐỘNG (Trang 27 - 29)

Tải bản đầy đủ (PDF)

(93 trang)