Speichern eines BMP-Bildes in einem QR-Code

8

Ich versuche zu erstellen (oder, wenn ich es irgendwie in meiner Forschung vermisst habe) einen Algorithmus zu finden, um ein BMP-Bild in ein QR-Code-Format zu codieren / zu decodieren. Ich habe einen Leitfaden ( Thonky ) verwendet, um zu versuchen, die Grundlagen von QR-Codes zu verstehen und ich bin Ich bin mir immer noch nicht sicher, wie ich dieses Problem lösen soll, insbesondere:

  • Sollte ich die Daten als binär kodieren oder wäre numerisch vernünftiger (vorausgesetzt, dass jedes Pixel einen maximalen Wert von 255 hat)?

  • Ich habe nach Informationen zu den strukturierten Append-Funktionen von QR-Codes gesucht, aber abgesehen von der Tatsache, dass sie von QR-Codes unterstützt wird, nicht viel Detail gefunden - wie kann ich diese Funktionalität implementieren / nutzen?

Und natürlich, wenn es irgendwelche Tipps / Vorschläge gibt, um ein Bild als Binärdaten besser zu speichern, bin ich sehr offen für Vorschläge!

Danke für Ihre Zeit,

Sean

    
user1748532 15.10.2012, 23:33
quelle

3 Antworten

9

Ich bin mir nicht sicher, ob Sie das erreichen können, da die Menge an Informationen, die ein QR-Code aufnehmen kann, ziemlich begrenzt ist.

Zunächst möchten Sie Ihr Bild wahrscheinlich als Rohbytes speichern, da die anderen Formate (numerisch und alphanumerisch) für die Speicherung von Text / Zahlen ausgelegt sind und weniger Platz für die Speicherung Ihres Bildes bieten. Angenommen, Sie wählen den größtmöglichen QR-Code (Version 40) mit der kleinsten Fehlerkorrekturstufe, der bis zu 2.953 Byte binäre Informationen enthalten kann (siehe hier) .

Die erste Option, wie Sie vorschlagen, speichern Sie das Bild als Bitmap. Dieses Format erlaubt überhaupt keine Komprimierung und benötigt (im Falle eines RGB-Bildes ohne Alpha-Kanal) 3 Bytes pro Pixel. Wenn wir die Dateikopfgröße (14 bis 54 Byte) berücksichtigen und die Auffüllung ignorieren (jede Zeile von Bilddaten muss auf eine Länge aufgefüllt werden, die ein Vielfaches von 4 ist), können Sie ungefähr 2900/3 = 966 speichern Pixel. Wenn wir ein quadratisches Bild betrachten, stellt dies eine 31x31-Bitmap dar, die selbst für ein Miniaturbild klein ist (zum Beispiel ist mein Avatar am Ende dieses Beitrags 32x32 Pixel).

Als zweite Option verwenden Sie JPEG, um Ihr Bild zu kodieren. Dieses Format hat den Vorteil, dass ein Komprimierungsalgorithmus verwendet wird, der die Dateigröße reduzieren kann. Dieses Mal gibt es keine genaue Formel, um die Größe eines Bildes in 2,9kB zu erhalten, aber ich habe versucht, einige quadratische Bilder zu verwenden und sie zu verkleinern, bis sie in diese Größe passen, wobei ein guter (93) Qualitätsfaktor erhalten bleibt von etwa 60x60 Pixelbildern. (Auf solchen kleinen Bildern ist es normal, keinen unglaublichen Komprimierungsfaktor zwischen jpeg und bmp zu sehen, da der Dateikopf in einer JPEG-Datei viel größer ist als in einer bmp-Datei: ungefähr 500 Bytes). Das ist besser als Bitmap, bleibt aber ziemlich klein.

Schließlich, selbst wenn es Ihnen gelingt, Ihr Bild in diesem QR-Code zu kodieren, werden Sie auf ein anderes Problem stoßen: Ein so großer QR-Code ist sehr, sehr schwer erfolgreich zu scannen. In der Tat wird dieser QR-Code eine Größe von 177x177 Modulen haben (ein "Modul" ist ein kleines weißes oder schwarzes Quadrat). Angenommen, Sie scannen es mit einem Smartphone, das sogenannte "HD" -Rahmen (1280x720 Pixel) liefert, hat jedes Modul eine maximale Größe von etwa 4 Pixeln. Wenn Sie das Kamerarauschen, das Aliasing und die Unschärfe berücksichtigen, weil der Benutzer beim Scannen nie völlig untätig ist, wird es die Qualität der Eingabeframes für jeden QR-Code-Decodieralgorithmus sehr schwierig machen, den QR zu erhalten Code (vergessen Sie nicht, dass wir den Fehlerkorrekturpegel zu Beginn auf Low setzen!).

Obwohl es keine sehr guten Nachrichten sind, hoffe ich, dass dir das hilft!

    
mbrenon 17.10.2012 08:38
quelle
2

Es gibt tatsächlich eine Möglichkeit, Informationen über mehrere (bis zu 16) QR-Codes zu verschlüsseln, indem Sie einen speziellen Header in Ihren QR-Codes mit dem Namen "Structured append" verwenden. Die beste Informationsquelle, die Sie verwenden können, ist die Norm über QR-Codes (ISO 18004: 2006); Es ist möglich (aber nicht unbedingt einfach), es kostenlos im Internet zu finden.

Der relevante Teil (Abschnitt 9) dieser Norm lautet:

"Es können bis zu 16 QR-Code-Symbole in einem strukturierten Format angehängt werden. Wenn ein Symbol Teil einer Structured Append-Nachricht ist, wird dies durch einen Kopfblock in den ersten drei Symbolzeichenpositionen angezeigt. Der Anzeiger des strukturierten Anhängemodus 0011 wird an den vier höchstwertigen Bitpositionen in dem ersten Symbolzeichen platziert. Diesem folgen unmittelbar zwei Codewörter für das strukturierte Anhängen, die über die vier niedrigstwertigen Bits des ersten Symbolzeichens, des zweiten Symbolzeichens und der vier höchstwertigen Bits des dritten Symbolzeichens verteilt sind. Das erste Codewort ist der Symbolsequenzindikator. Das zweite Codewort ist die Paritätsdaten und ist in allen Symbolen in der Nachricht identisch, so dass verifiziert werden kann, dass alle gelesenen Symbole Teil derselben Strukturierten Anhängen-Nachricht sind. Dieser Überschrift folgen unmittelbar die Datencodewörter für das Symbol, beginnend mit der ersten Modusanzeige. "

Trotzdem bin ich nicht sicher, ob die meisten QR-Code-Scanner damit umgehen können, da es sich um eine recht fortgeschrittene Funktion handelt.

    
mbrenon 19.10.2012 08:20
quelle
1
___ qstnhdr ___ Speichern eines BMP-Bildes in einem QR-Code ___ tag123qrcode ___ QR-Code ist ein ISO-standardisiertes zweidimensionales Barcode-Format. ___ antwort43869908 ___

Sie können eine feste Bildgröße definieren, JPG-Header-Teile reduzieren und nur wichtige Informationen darüber verwenden, so dass Sie bis zu 480 Bytes eines normalen Headers von ~ 500 Bytes speichern können.

Ich habe diese Methode verwendet, um Leute Fotos für einen kleinen Club ID-Karten zu speichern, Bilder mit 64x64 Pixel sind genug.

    
___ answer12970132 ___

Es gibt tatsächlich eine Möglichkeit, Informationen über mehrere (bis zu 16) QR-Codes zu verschlüsseln, indem Sie einen speziellen Header in Ihren QR-Codes mit dem Namen "Structured append" verwenden. Die beste Informationsquelle, die Sie verwenden können, ist die Norm über QR-Codes (ISO 18004: 2006); Es ist möglich (aber nicht unbedingt einfach), es kostenlos im Internet zu finden.

Der relevante Teil (Abschnitt 9) dieser Norm lautet:

"Es können bis zu 16 QR-Code-Symbole in einem strukturierten Format angehängt werden. Wenn ein Symbol Teil einer Structured Append-Nachricht ist, wird dies durch einen Kopfblock in den ersten drei Symbolzeichenpositionen angezeigt. Der Anzeiger des strukturierten Anhängemodus 0011 wird an den vier höchstwertigen Bitpositionen in dem ersten Symbolzeichen platziert. Diesem folgen unmittelbar zwei Codewörter für das strukturierte Anhängen, die über die vier niedrigstwertigen Bits des ersten Symbolzeichens, des zweiten Symbolzeichens und der vier höchstwertigen Bits des dritten Symbolzeichens verteilt sind. Das erste Codewort ist der Symbolsequenzindikator. Das zweite Codewort ist die Paritätsdaten und ist in allen Symbolen in der Nachricht identisch, so dass verifiziert werden kann, dass alle gelesenen Symbole Teil derselben Strukturierten Anhängen-Nachricht sind. Dieser Überschrift folgen unmittelbar die Datencodewörter für das Symbol, beginnend mit der ersten Modusanzeige. "

Trotzdem bin ich nicht sicher, ob die meisten QR-Code-Scanner damit umgehen können, da es sich um eine recht fortgeschrittene Funktion handelt.

    
___ answer12930316 ___

Ich bin mir nicht sicher, ob Sie das erreichen können, da die Menge an Informationen, die ein QR-Code aufnehmen kann, ziemlich begrenzt ist.

Zunächst möchten Sie Ihr Bild wahrscheinlich als Rohbytes speichern, da die anderen Formate (numerisch und alphanumerisch) für die Speicherung von Text / Zahlen ausgelegt sind und weniger Platz für die Speicherung Ihres Bildes bieten. Angenommen, Sie wählen den größtmöglichen QR-Code (Version 40) mit der kleinsten Fehlerkorrekturstufe, der bis zu 2.953 Byte binäre Informationen enthalten kann (siehe hier) .

Die erste Option, wie Sie vorschlagen, speichern Sie das Bild als Bitmap. Dieses Format erlaubt überhaupt keine Komprimierung und benötigt (im Falle eines RGB-Bildes ohne Alpha-Kanal) 3 Bytes pro Pixel. Wenn wir die Dateikopfgröße (14 bis 54 Byte) berücksichtigen und die Auffüllung ignorieren (jede Zeile von Bilddaten muss auf eine Länge aufgefüllt werden, die ein Vielfaches von 4 ist), können Sie ungefähr 2900/3 = 966 speichern Pixel. Wenn wir ein quadratisches Bild betrachten, stellt dies eine 31x31-Bitmap dar, die selbst für ein Miniaturbild klein ist (zum Beispiel ist mein Avatar am Ende dieses Beitrags 32x32 Pixel).

Als zweite Option verwenden Sie JPEG, um Ihr Bild zu kodieren. Dieses Format hat den Vorteil, dass ein Komprimierungsalgorithmus verwendet wird, der die Dateigröße reduzieren kann. Dieses Mal gibt es keine genaue Formel, um die Größe eines Bildes in 2,9kB zu erhalten, aber ich habe versucht, einige quadratische Bilder zu verwenden und sie zu verkleinern, bis sie in diese Größe passen, wobei ein guter (93) Qualitätsfaktor erhalten bleibt von etwa 60x60 Pixelbildern. (Auf solchen kleinen Bildern ist es normal, keinen unglaublichen Komprimierungsfaktor zwischen jpeg und bmp zu sehen, da der Dateikopf in einer JPEG-Datei viel größer ist als in einer bmp-Datei: ungefähr 500 Bytes). Das ist besser als Bitmap, bleibt aber ziemlich klein.

Schließlich, selbst wenn es Ihnen gelingt, Ihr Bild in diesem QR-Code zu kodieren, werden Sie auf ein anderes Problem stoßen: Ein so großer QR-Code ist sehr, sehr schwer erfolgreich zu scannen. In der Tat wird dieser QR-Code eine Größe von 177x177 Modulen haben (ein "Modul" ist ein kleines weißes oder schwarzes Quadrat). Angenommen, Sie scannen es mit einem Smartphone, das sogenannte "HD" -Rahmen (1280x720 Pixel) liefert, hat jedes Modul eine maximale Größe von etwa 4 Pixeln. Wenn Sie das Kamerarauschen, das Aliasing und die Unschärfe berücksichtigen, weil der Benutzer beim Scannen nie völlig untätig ist, wird es die Qualität der Eingabeframes für jeden QR-Code-Decodieralgorithmus sehr schwierig machen, den QR zu erhalten Code (vergessen Sie nicht, dass wir den Fehlerkorrekturpegel zu Beginn auf Low setzen!).

Obwohl es keine sehr guten Nachrichten sind, hoffe ich, dass dir das hilft!

    
___ tag123bmp ___ Das BMP-Dateiformat, auch als Bitmap-Bilddatei oder DIB-Dateiformat (Device Independent Bitmap) oder einfach als Bitmap bezeichnet, ist ein Rastergrafik-Bilddateiformat zum Speichern von digitalen Bitmap-Bildern, unabhängig vom Anzeigegerät (z ein Grafikadapter), insbesondere unter Microsoft Windows- und OS / 2-Betriebssystemen. ___ tag123datastorage ___ Das generische Konzept des Daten-Massenspeichers, nicht spezifisch für Hersteller oder Systemarchitektur. ___ qstntxt ___

Ich versuche zu erstellen (oder, wenn ich es irgendwie in meiner Forschung vermisst habe) einen Algorithmus zu finden, um ein BMP-Bild in ein QR-Code-Format zu codieren / zu decodieren. Ich habe einen Leitfaden ( Thonky ) verwendet, um zu versuchen, die Grundlagen von QR-Codes zu verstehen und ich bin Ich bin mir immer noch nicht sicher, wie ich dieses Problem lösen soll, insbesondere:

  • Sollte ich die Daten als binär kodieren oder wäre numerisch vernünftiger (vorausgesetzt, dass jedes Pixel einen maximalen Wert von 255 hat)?

  • Ich habe nach Informationen zu den strukturierten Append-Funktionen von QR-Codes gesucht, aber abgesehen von der Tatsache, dass sie von QR-Codes unterstützt wird, nicht viel Detail gefunden - wie kann ich diese Funktionalität implementieren / nutzen?

Und natürlich, wenn es irgendwelche Tipps / Vorschläge gibt, um ein Bild als Binärdaten besser zu speichern, bin ich sehr offen für Vorschläge!

Danke für Ihre Zeit,

Sean

    
___
wiitus 09.05.2017 12:30
quelle

Tags und Links