Nach
diesem Thread hab ich mir überlegt, dass es seltsam ist, dass Leute 3 Seiten mit DLLs rumeiern, statt so'n Ding einfach mal eben selbst zu schreiben. Also hab ich Donnerstag und Freitag nach Feierabend mal schnell eine nahezu komplette Klasse aus dem Boden gestampft. 100% Delphi. Es fehlt an sich nichts Wichtiges:
- Kanji werden nicht unterstützt, braucht in Europa keiner. Könnte man mal irgendwann nachtragen, dafür müsste ich mich aber mit Shift JIS auseinandersetzen, was dem zugrundeliegt.
- ECI (Extended Channel Interpretation) fehlt, gibt kaum Decoder dafür. Gehört zudem nicht unbedingt in die Klasse, da man die ECI-Daten auch als Eingabe übergeben kann.
- Automatische Aufteilung der Eingabe auf mehrere Streams mit jeweils unterschiedlicher Kodierung ist nicht implementiert. Würde was bringen, wenn abschnittsweise nur Ziffern oder abschnittsweise nur Großbuchstaben/Ziffern vorkommen.
Zugrunde liegt meine TRedeemerInheriablePNG, die ich gerne für neue Grafikformate nutze (sie teilt TPNGImage.CreateFromBlank in die Methoden Create und den Rest). LoadFromStream hätte man durch etwas Sinnvolles überschreiben können, am Ende sorgt das wohl für mehr Probleme mit Zeichensätzen. Die Klasse akzeptiert als Eingabedaten ausschließlich einen RawByteString, der Nutzer muss sich über die Daten also selbst Gedanken machen. Nach dem Standard von 2005 soll man Latin-1 nutzen, UTF-8 ist nicht offiziell unterstützt.
Delphi-Quellcode:
var
QR: TRedeemerQR;
begin
QR := TRedeemerQR.Create();
try
QR.LoadFromString(AnsiString(Edit1.Text), TQRECLevel(ComboBox1.ItemIndex));
Image1.Picture.Assign(QR);
finally
QR.Free();
end;
Es ist auch eine Klasse enthalten, mit der man allgemein Bitfelder zeichnen kann.
Zur Implementation genutzte Informationen:
-
http://www.swetake.com/qrcode/qr1_en.html (allgemeines Verfahren)
-
https://www.thonky.com/qr-code-tutorial/introduction (Maskenbewertung und die meisten Konstanten)
-
https://en.wikiversity.org/wiki/Reed...al_information (einige weitere Konstanten und Infos über das Interleaving mehrerer auch unterschiedlich großer Reed-Solomon-Blöcke)
GITHUB-PROJEKT
DOWNLOAD (enthält auch eine EXE-Demo und deren Sourcecode)