2012-10-15 20 views
8

Sto provando a creare (o, se in qualche modo mi sono perso nella mia ricerca, trovare) un algoritmo per codificare/decodificare un'immagine bmp in/da un formato di codice QR. Sto usando una guida (Thonky) per cercare di capire le basi di codici QR e io non sono ancora sicuro di come andare su questo problema, in particolare:Memorizzazione di un'immagine BMP in un codice QR

  • Devo codificare i dati in formato binario o sarebbe numerico essere più ragionevole (supponendo che ogni pixel avrà un valore massimo di 255)?

  • Ho cercato informazioni sulle funzionalità strutturate di aggiunta dei codici QR ma non ho trovato molti dettagli oltre al fatto che è supportato dai codici QR: come potrei implementare/utilizzare questa funzionalità?

E, naturalmente, se ci sono suggerimenti/suggerimenti per memorizzare meglio un'immagine come dati binari, sono molto aperto ai suggerimenti!

Grazie per il vostro tempo,

Sean

+0

vorrei chiedere se si vuole veramente fare questo. St ructured append non è supportato da quasi nessun lettore e in pratica un codice QR di dimensioni massime non è leggibile dalla maggior parte dei dispositivi. Codifica un semplice collegamento ipertestuale all'immagine. –

risposta

9

io non sono sicuro che sarete in grado di raggiungere questo obiettivo, in quanto la quantità di informazioni di un codice QR può contenere è abbastanza limitato.

Prima di tutto, probabilmente vorrai memorizzare l'immagine come grezzo, poiché gli altri formati (numerici e alfanumerici) sono progettati per contenere testo/numeri e fornirebbero meno spazio per memorizzare l'immagine. Supponiamo che tu scelga il codice QR più grande possibile (versione 40), con il più piccolo livello di correzione degli errori, che può contenere fino a 2953 byte di informazioni binarie (see here).

Prima opzione, come suggerito, l'immagine viene memorizzata come bitmap. Questo formato non consente alcuna compressione e richiede (nel caso di un'immagine RGB senza canale alfa) 3 byte per pixel. Se prendiamo in considerazione la dimensione dell'intestazione del file (da 14 a 54 byte) e ignoriamo il padding (ogni riga di dati dell'immagine deve essere riempita a una lunghezza da un multiplo di 4), che consente di memorizzare all'incirca 2900/3 = 966 pixel. Se consideriamo un'immagine quadrata, questo rappresenta un bitmap 31x31, che è piccolo anche per un'immagine in miniatura (ad esempio, il mio avatar alla fine di questo post è di 32x32 pixel).

Seconda opzione, si utilizza JPEG per codificare l'immagine. Questo formato ha il vantaggio di utilizzare un algoritmo di compressione che può ridurre le dimensioni del file. Questa volta non esiste una formula esatta per ottenere le dimensioni di un'immagine che si adattano a 2.9kB, ma ho provato a utilizzare poche immagini quadrate e ridimensionarle fino a quando non si adattano a queste dimensioni, mantenendo un buon fattore di qualità (93): ciò fornisce una media di circa 60x60 pixel di immagini. (Su immagini così piccole, è normale non vedere un incredibile fattore di compressione tra jpeg e bmp, dato che l'intestazione del file in un file jpeg è molto più grande di un file bmp: circa 500 byte). Questo è meglio di bitmap, ma rimane piuttosto piccolo.

Infine, anche se si riesce a codificare l'immagine in questo QR Code, si incontrerà un altro problema: un codice QR di questo tipo è molto, molto difficile da scansionare con successo. In effetti, questo QR Code avrà una dimensione di 177x177 moduli (un "modulo" è un piccolo quadrato bianco o nero). Supponendo di eseguirne la scansione utilizzando uno smartphone che fornisce i cosiddetti fotogrammi "HD" (1280x720 pixel), ciascun modulo avrà una dimensione massima sul fotogramma di circa 4 pixel. Se si tiene conto del rumore della fotocamera, dell'aliasing e della sfocatura dovuti al fatto che l'utente non è mai perfettamente inattivo durante la scansione, la qualità dei frame di input renderà molto difficile per qualsiasi algoritmo di decodifica QR Code ottenere correttamente il QR Codice (non dimenticare che abbiamo impostato il livello di correzione degli errori al più basso all'inizio di questo!).

Anche se non è una buona notizia, spero che questo ti aiuti!

+0

MBrenon, Grazie mille per la risposta. Non mi ero reso conto di quanto fosse un vincolo di dimensioni con cui avrei lavorato - suppongo di avere del lavoro da fare in termini di scansione (non sto lavorando con gli smartphone, quindi il problema più grande sarà la qualità del frame in ingresso a causa al mezzo utilizzato) rispetto alla quantità di dati memorizzati. Con questo in mente, io ancora non riesco a trovare tutte le informazioni sulla funzione di aggiunta strutturata di codici QR - avete tutte le risorse che spiegano come i codici QR 'link' insieme? Ancora una volta, grazie per questo input, mi aiuta sicuramente a capire il problema che sto affrontando! -Sean – user1748532

2

Esiste davvero un modo per codificare le informazioni su diversi (fino a 16) codici QR, utilizzando un'intestazione speciale nei tuoi codici QR denominata "Appendata strutturata". La migliore fonte di informazioni che puoi usare è la norma sui QR Code (ISO 18004: 2006); è possibile (ma non necessariamente facile) trovarlo gratuitamente sul web.

La parte rilevante (sezione 9) di questa norma dice:

"Fino a 16 simboli QR Code possono essere aggiunti in un formato strutturato Se un simbolo è parte di un messaggio Append strutturato, esso è indicato da. un blocco di testata nelle prime tre posizioni dei caratteri simbolo L'indicatore di modalità di aggiunta strutturata 0011 è collocato nelle quattro posizioni di bit più significative nel primo carattere simbolo Questo è immediatamente seguito da due parole di codice Aggiungi strutturate, distribuite tra le quattro meno significative. bit del primo carattere simbolo, il secondo carattere simbolo e i quattro bit più significativi del terzo carattere simbolo Il primo codice è l'indicatore della sequenza di simboli. dati ed è identico in tutti i simboli del messaggio, consentendo di verificare che tutti i simboli letti facciano parte dello stesso messaggio di aggiunta strutturata. Questa intestazione è immediatamente seguito dalle parole di codice di dati per il simbolo che inizia con il primo indicatore di modalità."

Tuttavia, io non sono sicuro che la maggior parte dei lettori di codici a barre in grado di gestire questo, in quanto è una caratteristica abbastanza avanzato.

1

È possibile definire una dimensione fissa dell'immagine, ridurre le parti di intestazione jpg e utilizzare solo informazioni vitali su di esso, in modo da poter salvare fino a 480bytes di un'intestazione normale ~ 500 byte.

Stavo usando questo metodo per memorizzare le foto delle persone per un piccolo carte d'identità -Club, immagini circa 64x64 pixel è sufficiente.