2012-10-15 11 views
8

Próbuję utworzyć (lub, jeśli w jakiś sposób przegapiłem to w moich badaniach, znaleźć) algorytm do kodowania/dekodowania obrazu bmp do/z formatu kodu QR. Używam przewodnika (Thonky), aby spróbować zrozumieć podstawy kodów QR, a ja nadal nie jestem pewien, jak go o tym problemie, a mianowicie:Przechowywanie obrazu BMP w kodzie QR

  • powinienem zakodować dane binarne lub jako czy numeryczne byłoby bardziej sensowne (zakładając, że każdy piksel ma maksymalną wartość 255)?

  • Szukałem informacji na temat możliwości strukturalnego dołączania kodów QR, ale nie znalazłem zbyt wielu szczegółów poza tym, że obsługiwane są przez kody QR - w jaki sposób mogę wdrożyć/wykorzystać tę funkcjonalność?

I, oczywiście, jeśli istnieją jakieś wskazówki/sugestie, aby lepiej przechowywać obraz jako dane binarne, jestem bardzo otwarty na sugestie!

Dzięki za poświęcony czas,

Sean

+0

Chciałbym zapytać, czy naprawdę chcesz to zrobić. rukowany append nie jest obsługiwany przez prawie żadnego czytnika, a maksymalny rozmiar kodu QR jest praktycznie nieczytelny dla większości urządzeń. Zakoduj prosty hiperlink do obrazu. –

Odpowiedz

9

nie jestem pewien, że będziesz w stanie osiągnąć, ponieważ ilość informacji QR Code może pomieścić jest dość ograniczona.

Po pierwsze, prawdopodobnie będziesz chciał zapisać obraz jako surowe bajty, ponieważ inne formaty (numeryczne i alfanumeryczne) są zaprojektowane do przechowywania tekstu/cyfr i zapewniają mniej miejsca na przechowywanie obrazu. Załóżmy, że wybierasz największy możliwy kod QR (wersja 40) z najmniejszym poziomem korekcji błędów, który może pomieścić do 2953 bajtów informacji binarnych (see here).

Pierwsza opcja, jak sugerujesz, zapisuje obraz jako bitmapę. Ten format nie pozwala na żadną kompresję i wymaga (w przypadku obrazu RGB bez kanału alfa) 3 bajtów na piksel. Jeśli weźmiemy pod uwagę rozmiar nagłówka pliku (od 14 do 54 bajtów) i zignorujemy dopełnienie (każdy wiersz danych obrazu musi zostać dopełniony do długości stanowiącej wielokrotność 4), co pozwala zachować około 2900/3 = 966 piksele. Jeśli weźmiemy pod uwagę kwadratowy obraz, reprezentuje on mapę bitową 31x31, która jest mała nawet dla obrazu miniatury (na przykład mój awatar na końcu tego posta ma 32 x 32 piksele).

Druga opcja polega na kodowaniu obrazu za pomocą JPEG. Ten format ma tę zaletę, że używa algorytmu kompresji, który może zmniejszyć rozmiar pliku. Tym razem nie ma dokładnej formuły, aby uzyskać rozmiar obrazu pasującego do 2,9 kB, ale spróbowałem użyć kilku kwadratowych obrazów i zmniejszyć ich rozmiar, dopóki nie zmieszczą się w tym rozmiarze, zachowując dobry (93) współczynnik jakości: daje to średnią około 60x60 pikseli. (Na takich małych obrazach normalne jest, że nie widać niewiarygodnego współczynnika kompresji pomiędzy jpeg i bmp, ponieważ nagłówek pliku w formacie jpeg jest znacznie większy niż w pliku bmp: około 500 bajtów). Jest to lepsze niż bitmapa, ale pozostaje dość małe.

Wreszcie, nawet jeśli uda ci się zakodować kod w tym kodzie QR, napotkasz inny problem: kod QR jest bardzo duży, bardzo trudny do zeskanowania. W rzeczywistości ten kod QR będzie miał wymiary 177x177 modułów ("moduł" będący małym białym lub czarnym kwadratem). Zakładając, że skanujesz go za pomocą smartfona dostarczającego tak zwane ramki "HD" (1280x720 pikseli), każdy moduł będzie miał maksymalny rozmiar na ramce około 4 pikseli. Jeśli weźmiesz pod uwagę hałas kamery, aliasing i rozmycie ze względu na fakt, że użytkownik nigdy nie jest doskonale bezczynny podczas skanowania, jakość ramek wejściowych bardzo utrudni dowolny algorytm dekodowania kodu QR, aby pomyślnie uzyskać kod QR Kod (nie zapominajmy, że ustawiliśmy na niskim poziomie poziom korekcji błędów!).

Mimo że to nie jest dobra wiadomość, mam nadzieję, że ci to pomoże!

+0

MBrenon, Dziękuję bardzo za odpowiedź. Nie zdawałem sobie sprawy, jak wiele z ograniczeniem wielkości Chciałbym pracować z - Przypuszczam, że mam coś do zrobienia w zakresie scanability (nie pracuję ze smartfonów więc największym problemem będzie jakość rama naliczony do używanego medium) w stosunku do ilości przechowywanych danych. W związku z tym nadal nie mogę znaleźć żadnych informacji na temat strukturalnej funkcji dołączania kodów QR - czy masz jakieś zasoby, które wyjaśniają, jak "połączyć" kody QR razem? Ponownie, dzięki za tego wejścia, to na pewno pomaga mi zrozumieć ten problem mam z widokiem! -Sean – user1748532

2

Istnieje rzeczywiście sposób kodowania informacji na temat kilku (do 16) kodów QR, używając specjalnego nagłówka w swoich kodach QR o nazwie "Dołączenie strukturalne". Najlepszym źródłem informacji, z których możesz skorzystać, jest norma dotycząca kodów QR (ISO 18004: 2006); jest to możliwe (ale niekoniecznie łatwe), aby znaleźć go za darmo w sieci.

Odpowiedni fragment (rozdział 9) tej normy mówi:

„do 16 symbole QR Code może być dołączone w formie strukturalnej Jeżeli symbol jest częścią zorganizowanego wiadomości Append, jest symbolem. blok nagłówka w pierwszych trzech pozycjach znaku symbolu Wskaźnik trybu strukturalnego Append 0011 jest umieszczony w czterech najbardziej znaczących pozycjach bitów w pierwszym znaku symbolu Po tym czasie następują dwa słowa kodowe Structured Append, rozłożone na cztery najmniej znaczące znaki. bity pierwszego znaku symbolu, drugiego znaku symbolu i czterech najbardziej znaczących bitów trzeciego znaku symbolu Pierwsze słowo kodu jest wskaźnikiem sekwencji symboli Drugim słowem kodowym jest pari znaków. dane i jest identyczny we wszystkich symbolach w komunikacie, umożliwiając sprawdzenie, czy wszystkie przeczytane symbole stanowią część tego samego komunikatu dołączonego do struktury. Nagłówek ten następuje bezpośrednio przez słowa kodowe danych dla symbolem rozpoczynającym się wskaźnik trybu pierwszy.”

Niemniej jednak, nie jestem pewien, że większość skanerów QR Code może obsłużyć tego, jak jest to dość zaawansowana funkcja.

1

Możesz zdefiniować stały rozmiar obrazu, zmniejszyć fragmenty nagłówka jpg i używać tylko istotnych informacji o nim, dzięki czemu możesz zapisać do 480 bajtów zwykłego nagłówka ~ 500 bajtów

Użyłem tej metody, aby przechowywać zdjęcia ludzi dla małych -klubowe karty identyfikacyjne, wystarczą obrazy o wielkości 64 x 64.