Hướng dẫn toàn diện: Cách khắc phục vấn đề kéo giãn camera ZXing, duy trì tỷ lệ khung hình chính xác
ZXing (Zebra Crossing) là thư viện quét mã vạch phổ biến cho Java và Android, nhưng nhiều nhà phát triển gặp phải lỗi kéo giãn hình ảnh camera khi tích hợp. Lỗi này khiến khung quét không khớp với vùng hiển thị, ảnh hưởng đến hiệu quả nhận diện mã vạch.
Nguyên nhân gây hiện tượng kéo giãn camera
- Tỷ lệ phân giải màn hình và camera không khớp
- Tính toán kích thước khung hiển thị sai
- Cấu hình bố cục view không phù hợp
Trong ZXing, xử lý tỷ lệ khung hình được thực hiện qua lớp CameraManager. Phương thức chính là getFramingRectInPreview().
1. Tính toán khung hiển thị
public synchronized Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Rect framingRect = getFramingRect();
if (framingRect == null) {
return null;
}
Rect rect = new Rect(framingRect);
Point cameraSize = configManager.getCameraResolution();
Point displaySize = configManager.getScreenResolution();
rect.left = (int)(rect.left * cameraSize.x / displaySize.x);
rect.right = (int)(rect.right * cameraSize.x / displaySize.x);
rect.top = (int)(rect.top * cameraSize.y / displaySize.y);
rect.bottom = (int)(rect.bottom * cameraSize.y / displaySize.y);
framingRectInPreview = rect;
}
return framingRectInPreview;
}
2. Tỷ lệ thu nhỏ chính xác
Trong ViewfinderView, ZXing sử dụng phương thức:
float scaleWidth = frame.getWidth() / (float) previewFrame.getWidth();
float scaleHeight = frame.getHeight() / (float) previewFrame.getHeight();
Mẹo khắc phục hiệu quả
Mẹo 1: Thiết lập thông số camera đúng
Kiểm tra CameraConfigurationManager để đảm bảo kích thước preview và capture khớp nhau.
Mẹo 2: Xử lý xoay màn hình
Khi thiết bị xoay, cần cập nhật lại khung quét dựa trên tỷ lệ mới.
Mẹo 3: Tương thích đa kích thước màn hình
Sử dụng layout tương đối và điều chỉnh tỷ lệ phù hợp với từng thiết bị.
So sánh trước/sau sửa lỗi
Trước: Hình ảnh bị méo, khung quét không khớp mã vạch Sau: Tỷ lệ khung hình chính xác, quét mã vạch hiệu quả
Thực hành tốt nhất
- Luôn dùng
getFramingRectInPreview()để lấy tọa độ - Khởi tạo lại thông số camera khi xoay màn hình
- Kiểm tra trên nhiều thiết bị khác nhau
Kiểm tra lỗi thường gặp
- Xác minh tỷ lệ phân giải camera và màn hình
- Kiểm tra công thức tính kích thước khung
- Đảm bảo layout không ép méo khung preview
Áp dụng các hướng dẫn này giúp bạn giải quyết triệt để vấn đề tỷ lệ khung hình trong ZXing, nâng cao trải nghiệm quét mã vạch trên Android.