2012-10-15 75 views
8

Tôi đang cố gắng tạo (hoặc, nếu tôi bằng cách nào đó đã bỏ lỡ nó trong nghiên cứu của mình, hãy tìm) một thuật toán để mã hóa/giải mã hình ảnh bmp thành/từ định dạng mã QR. Tôi đã sử dụng một hướng dẫn viên (Thonky) để cố gắng tìm hiểu những điều cơ bản của mã QR và tôi vẫn không chắc chắn làm thế nào để đi về vấn đề này, cụ thể là:Lưu trữ hình ảnh BMP trong mã QR

  • Tôi có nên mã hóa các dữ liệu như nhị phân hoặc số sẽ hợp lý hơn (giả sử mỗi pixel sẽ có giá trị tối đa là 255)?

  • Tôi đã tìm kiếm thông tin về khả năng nối thêm của mã QR nhưng không tìm thấy nhiều chi tiết ngoài thực tế là mã QR được hỗ trợ - làm cách nào tôi có thể triển khai/sử dụng chức năng này?

Và, tất nhiên, nếu có bất kỳ mẹo/đề xuất nào để lưu trữ hình ảnh dưới dạng dữ liệu nhị phân, tôi rất cởi mở với đề xuất!

Cảm ơn thời gian của bạn,

Sean

+0

Tôi sẽ hỏi bạn có thực sự muốn làm điều này không. tính năng nối thêm linh hoạt không được hỗ trợ bởi bất kỳ trình đọc nào và mã QR kích thước tối đa không thể đọc được bởi hầu hết các thiết bị trong thực tế. Mã hóa một siêu liên kết đơn giản đến hình ảnh. –

Trả lời

9

Tôi không chắc chắn bạn sẽ có thể đạt được điều đó, như số lượng thông tin một Mã QR có thể chứa là khá hạn chế.

Trước hết, bạn có thể muốn lưu trữ hình ảnh dưới dạng byte thô, vì các định dạng khác (chữ số và chữ số) được thiết kế để giữ văn bản/số và cung cấp ít không gian hơn để lưu trữ hình ảnh của bạn. Giả sử bạn chọn Mã QR có thể lớn nhất (phiên bản 40), với mức sửa lỗi nhỏ nhất, có thể chứa tới 2953 byte thông tin nhị phân (see here).

Tùy chọn đầu tiên, như bạn đề xuất, bạn lưu trữ hình ảnh dưới dạng bitmap. Định dạng này cho phép không nén và yêu cầu (trong trường hợp hình ảnh RGB không có kênh alpha) 3 byte trên mỗi pixel. Nếu chúng ta xem xét kích thước tiêu đề của tệp (14 đến 54 byte) và bỏ qua phần đệm (mỗi hàng dữ liệu hình ảnh phải được đệm thành chiều dài là bội số của 4), cho phép bạn lưu trữ khoảng 2900/3 = 966 pixel. Nếu chúng ta xem xét một hình ảnh vuông, điều này đại diện cho một bitmap 31x31, đó là nhỏ ngay cả đối với một hình ảnh thu nhỏ (ví dụ, hình đại diện của tôi ở cuối bài đăng này là 32x32 pixel).

Tùy chọn thứ hai, bạn sử dụng JPEG để mã hóa hình ảnh của mình. Định dạng này có lợi thế là sử dụng thuật toán nén có thể giảm kích thước tệp. Lần này không có công thức chính xác để lấy kích thước của hình ảnh phù hợp trong 2.9kB, nhưng tôi đã thử sử dụng một vài hình ảnh vuông và giảm kích thước cho đến khi chúng vừa với kích thước này, giữ một yếu tố chất lượng tốt (93): khoảng 60x60 pixel hình ảnh. (Trên những hình ảnh nhỏ như vậy, bình thường không thấy một hệ số nén đáng kinh ngạc giữa jpeg và bmp, vì tiêu đề tệp trong tệp jpeg lớn hơn nhiều so với tệp bmp: khoảng 500 byte). Điều này là tốt hơn so với bitmap, nhưng vẫn còn khá nhỏ.

Cuối cùng, ngay cả khi bạn thành công trong việc mã hóa hình ảnh của mình trong Mã QR này, bạn sẽ gặp một vấn đề khác: Mã QR lớn này rất, rất khó quét thành công. Như một vấn đề của thực tế, mã QR này sẽ có kích thước 177x177 mô-đun (một "mô-đun" là một hình vuông nhỏ màu trắng hoặc đen). Giả sử bạn quét nó bằng điện thoại thông minh cung cấp các khung hình "HD" (1280x720 pixel), mỗi mô-đun sẽ có kích thước tối đa trên khung khoảng 4 pixel. Nếu bạn tính đến nhiễu máy ảnh, răng cưa và mờ do thực tế người dùng không bao giờ hoàn toàn nhàn rỗi khi quét, chất lượng của khung đầu vào sẽ khiến cho mọi thuật toán giải mã mã QR trở nên rất khó để có được QR thành công Mã (đừng quên chúng tôi thiết lập mức độ sửa lỗi của nó ở mức thấp vào đầu này!).

Mặc dù đây không phải là tin tốt nhưng tôi hy vọng điều này sẽ giúp ích cho bạn!

+0

MBrenon, Cảm ơn bạn rất nhiều vì đã trả lời. Tôi không nhận ra tôi sẽ làm việc với bao nhiêu kích thước - tôi cho rằng tôi có một số việc phải làm về khả năng quét (tôi không làm việc với điện thoại thông minh nên vấn đề lớn nhất sẽ là chất lượng khung hình đầu vào cho phương tiện đang được sử dụng) so với lượng dữ liệu được lưu trữ. Với ý nghĩ đó, tôi vẫn không thể tìm thấy bất kỳ thông tin nào về tính năng nối thêm có cấu trúc của mã QR - bạn có bất kỳ tài nguyên nào giải thích cách 'liên kết' mã QR với nhau không? Một lần nữa, cảm ơn cho đầu vào này, nó chắc chắn giúp tôi hiểu được vấn đề tôi đang gặp phải! -Sean – user1748532

2

Có thực sự là một cách để mã hóa thông tin trên một số (lên đến 16) mã QR, sử dụng một tiêu đề đặc biệt trong mã QR của bạn được gọi là "cấu trúc nối thêm". Nguồn thông tin tốt nhất mà bạn có thể sử dụng là tiêu chuẩn về Mã QR (ISO 18004: 2006); nó có thể (nhưng không nhất thiết phải dễ dàng) để tìm nó miễn phí trên web.

Phần liên quan (phần 9) của chuẩn mực này cho biết:

"Lên đến 16 ký tự mã QR có thể được nối trong một định dạng cấu trúc Nếu một biểu tượng là một phần của thông điệp Nối cấu trúc, nó được chỉ định bởi. Một khối tiêu đề trong ba vị trí ký tự đầu tiên của biểu tượng Chỉ báo chế độ nối bổ sung 0011 được đặt ở bốn vị trí bit quan trọng nhất trong ký tự đầu tiên. các bit của ký tự biểu tượng đầu tiên, ký tự biểu tượng thứ hai và bốn bit quan trọng nhất của ký tự thứ ba ký tự đầu tiên là ký hiệu chuỗi ký tự đầu tiên. dữ liệu ty và giống hệt nhau trong tất cả các biểu tượng trong thông báo, cho phép nó được xác minh rằng tất cả các ký hiệu đều đọc một phần của cùng một thông điệp Nối kết có cấu trúc. Tiêu đề này là ngay lập tức theo sau là từ mã dữ liệu cho các biểu tượng bắt đầu với chỉ số Chế độ đầu tiên."

Tuy nhiên, tôi không chắc chắn hầu hết các máy quét mã QR có thể xử lý này, vì nó là một tính năng khá tiên tiến.

1

Bạn có thể xác định kích thước hình ảnh cố định, giảm các phần tiêu đề jpg và chỉ sử dụng thông tin quan trọng về nó, vì vậy bạn có thể tiết kiệm tới 480byte của tiêu đề bình thường ~ 500bytes ~ 5002 bytes thẻ ID câu lạc bộ, hình ảnh khoảng 64x64 pixel là đủ.