Bài viết này mình sẽ giới thiệu một thành phần cũng rất quan trọng trong CameraX, đó là Vendor Extensions.
1. Giới thiệu
Trong các buổi giới thiệu điện thoại gần đây của các nhà sản xuất điện thoại hệ điều hành Android như Samsung hay Google và Huawei thì chắc hẳn các bạn đã không còn xa lạ với các tính năng chụp ảnh bá đạo có thể kể đến như là HDR, Bokeh, Night, Beauty, Auto. Ngoài hệ thống phần cứng bao gồm bộ các camera thông thường, camera tele, camera góc rộng hay camera macro thì phần mềm tích hợp cũng làm cho các bức ảnh trở nên ảo diệu hơn trông thấy.
Với sự cộng tác với 1 số nhà sản xuất thiết bị gốc (OEM) như LG và Samsung; Google đã phát triển tính năng mở rộng cho camera trên thiết bị di động. CameraX cung cấp 1 số API extensions như Bokeh, HDR và 1 số tính năng được implement bởi từng nhà sản xuất đặc biệt cho thiết bị của họ.
Thiết bị hỗ trợ vendor extension phải đạt các điều kiện sau:
- Hiệu ứng phải có thư viện hỗ trợ từ nhà sản xuất thiết bị (OEM)
- Thư viện OEM phải được cài đặt trên thiết bị hiện tại
- Thư viện OEM báo cáo thiết bị hỗ trợ tiện ích mở rộng
- Thiết bị có phiên bản hệ điều hành mà thư viện yêu cầu
2. Extension architecture
Extensions được tách ra từ Camera2 core của CameraX. Trong hình, các đường mũi tên màu đỏ thể hiện đường đi khi người dùng kích hoạt tính năng tiện ích mở rộng (vd HDR)
3. Implementation
Để sử dụng các extensions, bạn phải implement thư viện hỗ trợ:
1 2 | implementation <span class="token string">"androidx.camera:camera-extensions:1.0.0-alpha08"</span> |
Để sử dụng extension trong CameraX, bạn phải tạo object Extender tương ứng phù hợp với nhu cầu sử dụng:
- AutoImageCaptureExtender
- BeautyImageCaptureExtender
- BokehImageCaptureExtender
- HdrImageCaptureExtender
- NightImageCaptureExtender
Để bật extension, các bạn sử dụng method enableExtension()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | val cameraSelector <span class="token operator">=</span> CameraSelector<span class="token punctuation">.</span><span class="token function">Builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">requireLensFacing</span><span class="token punctuation">(</span>CameraSelector<span class="token punctuation">.</span>LENS_FACING_BACK<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span> val imageCaptureBuilder <span class="token operator">=</span> ImageCapture<span class="token punctuation">.</span><span class="token function">Builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> val bokehImageCapture <span class="token operator">=</span> BokehImageCaptureExtender<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>imageCaptureBuilder<span class="token punctuation">)</span> <span class="token keyword">if</span><span class="token punctuation">(</span>bokehImageCapture<span class="token punctuation">.</span><span class="token function">isExtensionAvailable</span><span class="token punctuation">(</span>cameraSelector<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> bokehImageCapture<span class="token punctuation">.</span><span class="token function">enableExtension</span><span class="token punctuation">(</span>cameraSelector<span class="token punctuation">)</span> Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"Bokeh extension is enabled"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"Sorry! This device didn't support Bokeh extension"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">e</span><span class="token operator">:</span> Exception<span class="token punctuation">)</span><span class="token punctuation">{</span> Log<span class="token punctuation">.</span><span class="token function">d</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> e<span class="token punctuation">.</span>message<span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Ở đoạn code trên mình có tạo cameraSelector để chụp ảnh từ camera phía sau LENS_FACING_BACK và sử dụng hiệu ứng Bokeh khi thiết bị hỗ trợ. Nếu muốn sử dụng các hiệu ứng khác thì bạn hoàn toàn có thể với những object Extender mình đã liệt kê phía trên.
Tham khảo
https://developer.android.com/training/camerax/vendor-extensions