Java hatte eine QR-Code-Erstellungsbibliothek namens QRGen, die ZXing gut umschließt, also habe ich es versucht

Einführung

Wenn ich von Bibliotheken spreche, die QR-Code in Java erstellen, habe ich den Eindruck, dass ZXing von Google häufig eingeführt wird. Als ich es tatsächlich benutzte, war ich ein wenig besorgt, dass der Quellcode relativ niedrig aussehen würde.

Grob geschrieben sieht es so aus.

Quellcode zum Generieren von QR-Bildern mit ZXing


BitMatrix matrix = new QRCodeWriter().encode(
    "https://qiita.com/nimzo6689", BarcodeFormat.QR_CODE, 320, 320
);
BufferedImage qrCodeImage = MatrixToImageWriter.toBufferedImage(matrix);
ImageIO.write(qrCodeImage, "png", Files.newOutputStream(Paths.get("qrcode.png ")));

In den meisten Fällen wird es jedoch in der Realität komplizierter. Passen Sie beispielsweise die Ränder an, ändern Sie den Zeichencode, wechseln Sie zu einer anderen Farbe anstelle von Schwarzweiß usw. Ich denke auch, dass es Fälle gibt, in denen Sie als SVG-Datei ausgeben möchten, damit sich die Bildqualität nicht verschlechtert, selbst wenn Sie sie dehnen.

Wenn Sie versuchen, das oben genannte zu erreichen, haben Sie mehr Code mit niedrigeren Ebenen. Wenn Sie eine Bibliothek namens QRGen verwenden, die durch das Umschließen von ZXing erstellt wurde, Ich habe kürzlich erfahren, dass Sie einfach einen Prozess schreiben können, um ein QR-Bild mit einer Methodenkette zu generieren. Ich habe versucht zusammenzufassen, wie man es benutzt.

Wie installiert man

Grundsätzlich wie gewohnt für Paketverwaltungstools wie Maven, Gradle Es kann durch Hinzufügen einer Abhängigkeit verwendet werden. Seit Version 2.1.0 ist jedoch ein Punkt zu beachten Wir haben es nicht für Maven Central freigegeben Es ist erforderlich, jitpack.io zum Repository hinzuzufügen.

Wie es auf der offiziellen Seite ist, ist es in Gradle wie folgt.

build.gradle


apply plugin: 'java'

sourceCompatibility = 1.12

repositories {
    maven {
        url "https://jitpack.io"
    }
}

dependencies {
    //Bei Verwendung mit Java SE. Unter Android ist die Artefakt-ID Android.
    compile 'com.github.kenglxn.QRGen:javase:2.6.0'
}

Mit ZXing müssen Sie Core und Javase oder Android und zwei Abhängigkeiten schreiben. Mit QRGen brauchen Sie nur einen, damit Sie ihn ein wenig genießen können.

Anwendungsbeispiel

Ich werde den Quellcode, den ich lokal ausprobiert habe, später veröffentlichen. Wie der Name schon sagt, ist QRGen eine dedizierte Bibliothek zum Generieren von QR-Code Es scheint, dass Sie die ZXing-API verwenden müssen, wenn Sie scannen möchten.

Der in diesem Artikel veröffentlichte Code wurde in der folgenden Umgebung überprüft.

Windows10 Pro, Java12(AdoptOpenJDK with HotSpot), IntelliJ IDEA 2019

Der Beispielcode im Artikel lässt die Importanweisung usw. weg. Wenn Sie also die gesamte Datei überprüfen möchten, lesen Sie bitte Gist.

Stellen Sie außerdem sicher, dass das generierte QR-Bild von der Android-App [hier] gelesen werden kann (https://play.google.com/store/apps/details?id=com.google.zxing.client.android&hl=ja). tat.

Dateiobjekt generieren und ausgeben

Erstens, wie man es mit einem Dateiobjekt erstellt.

Da QRCode # file eine Image-Datei namens QRCode.png im temporären Verzeichnis erstellt, Es bewegt sich zu dem Pfad, in dem Sie es ausgeben möchten.

Ich habe "REPLACE_EXISTING" angegeben, damit ich so oft ich möchte in denselben Dateinamen schreiben kann.

QRGenToFile.java


File qrCode = QRCode.from("https://qiita.com/nimzo6689").file();
Files.copy(qrCode.toPath(), Paths.get("qrcode.png "), StandardCopyOption.REPLACE_EXISTING);

Es ist das gleiche wie der Beispielcode, den ich am Anfang geschrieben habe, aber es ist viel einfacher Sie müssen nicht einmal die ZXing-API kennen, was die Implementierung und das Lesen erleichtert.

Hier ist das tatsächlich erzeugte QR-Bild. Wenn Sie keine Größe angeben, scheint es 125x125 zu sein.

qrcode.png

Generieren und Ausgeben des ByteArrayOutputStream-Objekts

Im Folgenden wird beschrieben, wie Sie ein ByteArrayOutputStream-Objekt erstellen.

QRGenToBaos.java


try (ByteArrayOutputStream qrCode = QRCode.from("https://qiita.com/nimzo6689").stream();
        OutputStream outputStream = Files.newOutputStream(Paths.get("qrcode.png "))) {

    qrCode.writeTo(outputStream);
    qrCode.flush();
}

Die Codemenge ist größer als die von "QRCode # file". Zum Beispiel "ImageIO.read (neuer ByteArrayInputStream (qrCode.toByteArray ())") Dies scheint praktisch zu sein, wenn Sie "BufferedImage" generieren und eine Art Bildverarbeitung durchführen möchten.

Außerdem erstelle ich keine temporäre Datei, daher scheint die Leistung besser zu sein.

Ausgabe an ein generiertes OutputStream-Objekt

QRCode # stream hat einen neuen OutputStream erstellt, Wenn Sie ein QR-Bild in einen bereits generierten Ausgabestream schreiben möchten, können Sie "QRCode # writeTo" verwenden.

QRGenToExistingOs.java


try (OutputStream os = Files.newOutputStream(Paths.get("qrcode.png "))) {
    QRCode.from("https://qiita.com/nimzo6689").writeTo(os);
    os.flush();
}

Es erfordert weniger Beschreibung als "QRCode # stream".

Ausgabe durch Angabe verschiedener Einstellwerte

Sie können das Bildformat, die Größe und die Farbe des generierten QR-Bildes angeben. Darüber hinaus können die in EncodeHintType in ZXing angegebenen Einstellungen auch über das QRCode-Objekt festgelegt werden.

QRGenWithHint.java


File qrCode = QRCode.from("https://qiita.com/nimzo6689")
        .to(ImageType.GIF)
        .withSize(320, 320)
        .withColor(0xFF6876B4, 0xFFF7F4F7)
        .withCharset("UTF-8")
        .withErrorCorrection(ErrorCorrectionLevel.L)
        .withHint(EncodeHintType.MARGIN, 2)
        .file();

Files.copy(qrCode.toPath(), Paths.get("qrcode.gif"), StandardCopyOption.REPLACE_EXISTING);

Der durch "withColor" angegebene Wert hat das Format Transparenz (2 Byte) + RGB (6 Byte).

Das erzeugte QR-Bild ist hier.

qrcode.gif

Ausgabe als SVG-Datei

Die SVG-Konvertierung ist nur für Java SE verfügbar. Android ist nicht verfügbar, stattdessen können Sie QR-Bilder in ImageView ohne Dateierzeugung anzeigen Es scheint, dass QRCode # bitmap verfügbar ist. (Diesmal nicht verifiziert)

QRGenToSvg.java


File qrCode = QRCode.from("https://qiita.com/nimzo6689").svg();
Files.copy(qrCode.toPath(), Paths.get("qrcode.svg"), StandardCopyOption.REPLACE_EXISTING);

Die generierte "qrcode.svg" wird beim Öffnen in Chrome usw. ordnungsgemäß gerendert.

Wenn Sie sich Gedanken über die Bildqualität von QR-Bildern machen oder wenn Sie auf großem Papier strecken und drucken möchten Dies ist hilfreich, da Sie kein großes QR-Bild erstellen müssen.

Probieren Sie verschiedene Schemata aus

QR-Bilder werden zusätzlich zur URL für E-Mails, Standortinformationen, WLAN usw. verwendet. Es gibt auch mehrere Schemaobjekte, die Informationen für jedes dieser Datenformate enthalten.

Es scheint, dass "README" insgesamt 16 Schemata unterstützt, Wenn man sich den Quellcode ansieht, scheint es tatsächlich noch ein paar mehr zu geben. Es gibt auch KddiAu. ~~ Zu bewusst! ~~

URL-Schema

Ein Schema, das die URL einer Webseite enthält. Sie können http oder eine Zeichenfolge speichern, die mit https beginnt.

Ich denke nicht, dass es notwendig ist, "QRCode :: from" über dieses Objekt zu füttern.

QRGenForUrl.java


Url url = Url.parse("https://qiita.com/nimzo6689");
File qrCode = QRCode.from(url).file();
Files.copy(qrCode.toPath(), Paths.get("qrcode.png "), StandardCopyOption.REPLACE_EXISTING);

E-Mail-Schema

Ein Schema, das E-Mail-Adressen enthält. Sie können eine Zeichenfolge im Format "mailto: email address" speichern.

Vorerst können Sie "neue E-Mail (" mailto: [email protected] ")" schreiben, aber In diesem Fall wird keine Überprüfungsverarbeitung durchgeführt, z. B. ob es sich um eine Zeichenfolge handelt, die mit "mail to:" beginnt Grundsätzlich halte ich es für angebracht, "EMail :: parse" zu verwenden.

QRGenForEmail.java


EMail email = EMail.parse("mailto:[email protected]");
File qrCode = QRCode.from(email).file();
Files.copy(qrCode.toPath(), Paths.get("qrcode.png "), StandardCopyOption.REPLACE_EXISTING);

Als ich Google Mail als App zum Lesen und Starten ausgewählt habe, wurde die im QR-Bild eingebettete E-Mail-Adresse in An eingegeben.

GeoInfo-Schema

Ein Schema, das Standortinformationen enthält. Sie können Zeichenfolgen im Format "Geo: Breite, Länge" speichern.

QR-Bilder werden im Allgemeinen verwendet, wenn Sie auf Webinformationen aus Geschäften usw. zugreifen möchten, anstatt sie auf der Website zu verbreiten. Es ist schwer sich eine Szene vorzustellen, in der das QR-Bild der Positionsinformationen verwendet wird. Ich bin gespannt, wie man es benutzt.

QRGenForGeoInfo.java


GeoInfo geoInfo = GeoInfo.parse("geo:35.6761775,139.7173954");
File qrCode = QRCode.from(geoInfo).file();
Files.copy(qrCode.toPath(), Paths.get("qrcode.png "), StandardCopyOption.REPLACE_EXISTING);

In dem bei der Überprüfung verwendeten QR-Codeleser werden die Menüs "Karte anzeigen" und "Route suchen" angezeigt Wenn Sie "Karte anzeigen" auswählen, wird die Karte um die relevanten Standortinformationen angezeigt. Wenn Sie "Route suchen" auswählen, wird die Route von Ihrem aktuellen Standort zum entsprechenden Standort auf Google Map angezeigt.

abschließend

Es wäre schön, wenn das Logo-Bild gut in der Mitte platziert werden könnte.

Recommended Posts

Java hatte eine QR-Code-Erstellungsbibliothek namens QRGen, die ZXing gut umschließt, also habe ich es versucht
[Android] Eine Geschichte, die bei der Einführung von ZXing, einer QR-Code-Funktionsbibliothek, ins Stolpern geriet
Es fiel mir schwer, Java-Multithreading von Grund auf neu zu erstellen. Organisieren Sie es also
7 Dinge, die du behalten sollst, damit es kein verdammter Code wird
Java SE 13 (JSR388) wurde veröffentlicht, also habe ich es versucht
Ich habe Tribuo von Oracle ausprobiert. Tribuo - Eine Java-Vorhersagebibliothek (v4.0)
Ich habe versucht, Java mit einer Reihe zu lernen, die Anfänger klar verstehen können