QR code in Java selber generieren

Solltest du nicht lieber zuerst einmal in Gänze und vollständig die Funktionsweise und Implementierung einer CPU verstehen, bevor du dich an so etwas high-levelliges wie das Erstellen eines QR-Codes mittels Software in Java wagst?

Was ist denn aus dem vorherigen Thread geworden?

Wenn jetzt deine CPU abraucht, weil du eine Endlosschleife in deinem QR-Code-Erstellungsprogramm programmiert hast und die Temperaturfühler der CPU zu diesem Zeitpunkt rein zufällig allesamt kaputtgegangen sind, so dass die CPU sich nicht heruntergethrottled hat und die Lüftung auch nicht ausreichend war...

Da solltest du schon in der Lage sein, das wieder reparieren zu können.

Schließlich will man doch komplett alles verstehen und auch reparieren können...

Das siehst du sicherlich ganz genauso.

Deshalb finde ich, springst du zu viel zwischen unterschiedlichen Themen und Abstraktionsebenen hindundher. Zuerst einmal solltest du dich wirklich mit Elektronik/Elektrotechnik beschäftigen.
 
Das Muster ergibt sich automatisch. Die Codewörter werden von rechts unten nach links oben ausgegeben, wobei die Richtung alterniert. Im "Normalfall" werden die 8 Bits in rechteckige 2x4-Blöcke gesetzt. Jetzt gibt es aber Module, die anderweitig belegt sind und "im Weg" stehen, so dass sich andere Muster ergeben.
 
@mihe7 Ich denke, Data Matrix ist erst einmal etwas einfacher.

Aber auch dort verstehe ich die Anordnung nicht. Insbesondere dies: https://en.wikipedia.org/wiki/Data_Matrix#Encoding und https://upload.wikimedia.org/wikipedia/commons/a/a7/Datamatrixfilling.png .

Auf den ISO-Standard habe ich keinen Zugriff, muss mich so ein bisschen zwischen den Wikipedia Artikeln hin und her hangeln.

Das ist der bisherige Ansatz:

Java:
import javax.swing.*;
import java.awt.*;

public class DataMatrix {
    static class DMCanvas extends Canvas {
        private static final int size1 = 20;
        private static final int size2 = 18;
        private boolean[][] bits = new boolean[size2][size2];

        public void setText(String text) {
            if (text.length() > size2 * size2) {
                throw new IllegalArgumentException();
            }
            bits = new boolean[size2][size2];
            int i = 0;
            for (char c : text.toCharArray()) {
                if (c > 255) {
                    throw new IllegalArgumentException();
                }
                for (int j = 0; j < 8; j++) {
                    if ((c & 1) == 1) {
                        bits[i / size2][i % size2] = true;
                    }
                    c >>= 1;
                    i++;
                }
            }
        }

        private void set(int x, int y, boolean one, Graphics g) {
            int w = this.getWidth();
            int h = this.getHeight();
            int max = Math.min(w, h) - 40;
            int len = (int) Math.floor(max / 20.0);
            if (one) {
                g.fillRect(10 + x * len, 10 + y * len, len, len);
            }
        }

        private void setBorders(Graphics g) {
            for (int i = 0; i < size1; i++) {
                set(i, 0, i % 2 == 0, g);
                set(size1 - 1, i, i % 2 != 0, g);
                set(0, i, true, g);
                set(i, size1 - 1, true, g);
            }
        }

        private void setDataMatrix(Graphics g) {
            for (int y = 0; y < size2; y++) {
                for (int x = 0; x < size2; x++) {
                    set(1 + x, 1 + y, bits[y][x], g);
                }
            }
        }

        @Override
        public void paint(Graphics g) {
            setBorders(g);
            setDataMatrix(g);
        }
    }

    public DataMatrix() {
        DMCanvas can = new DMCanvas();
        can.setText("Hallo Welt...");
        JFrame frame = new JFrame("DataMatrixCode");
        frame.add(can);
        frame.setSize(425, 450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new DataMatrix();
    }
}

Funktioniert nur leider nich, das Finder Pattern und das Alternating Pattern müsste richtig sein, aber der Rest... 🤷‍♂️

1696926695631.png
 

Neue Themen


Zurück
Oben