Java avait une bibliothèque de création de code QR appelée QRGen qui enveloppe bien ZXing, alors je l'ai essayé

introduction

En parlant de bibliothèques qui créent du code QR en Java, j'ai l'impression que ZXing made by Google est souvent introduit. Quand je l'ai utilisé, j'étais un peu inquiet que le code source paraisse relativement bas.

En gros, ça ressemble à ça.

Code source pour générer des images QR à l'aide de 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 ")));

Cependant, dans la plupart des cas, cela devient plus compliqué en réalité. Par exemple, ajustez les marges, modifiez le code de caractère, passez à une couleur différente au lieu du noir et blanc, etc. De plus, je pense qu'il y a des cas où vous voulez sortir sous forme de fichier SVG afin que la qualité de l'image ne se détériore pas même si vous l'étirez.

Si vous essayez d'atteindre ce qui précède, vous aurez plus de code avec des couches inférieures, Si vous utilisez une bibliothèque appelée QRGen créée en enveloppant ZXing, J'ai récemment appris que vous pouvez facilement écrire un processus pour générer une image QR avec une chaîne de méthodes. J'ai essayé de résumer comment l'utiliser.

Comment installer

Fondamentalement, comme d'habitude pour les outils de gestion de paquets tels que Maven, Gradle Il peut être utilisé en ajoutant une dépendance. Cependant, il y a un point à noter, depuis la version 2.1.0 Nous ne l'avons pas publié dans Maven Central Il est nécessaire d'ajouter jitpack.io au référentiel.

Tel qu'il est sur la page officielle, c'est comme suit dans Gradle.

build.gradle


apply plugin: 'java'

sourceCompatibility = 1.12

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

dependencies {
    //Lors de l'utilisation avec Java SE. Sur Android, l'artefactId sera android.
    compile 'com.github.kenglxn.QRGen:javase:2.6.0'
}

Avec ZXing, vous devez écrire core et javase, ou android et deux dépendances, Avec QRGen, vous n'en avez besoin que d'un seul pour pouvoir en profiter un peu.

Exemple d'utilisation

Je publierai le code source que j'ai essayé localement plus tard. Comme son nom l'indique, QRGen est une bibliothèque dédiée à la génération de code QR, donc Il semble que vous deviez utiliser l'API de ZXing si vous souhaitez numériser.

Le code publié dans cet article a été vérifié dans l'environnement suivant.

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

L'exemple de code dans l'article omet l'instruction d'importation, etc., donc si vous souhaitez vérifier l'intégralité du fichier, reportez-vous à Gist.

Assurez-vous également que l'image QR générée peut être lue par l'application Android ici. fait.

Générer et générer un objet File

Le premier est de savoir comment le créer avec un objet File.

Puisque QRCode # file crée un fichier image appelé QRCode.png dans le répertoire temporaire, Il se déplace vers le chemin où vous souhaitez le sortir.

J'ai spécifié REPLACE_EXISTING afin de pouvoir écrire sur le même nom de fichier autant de fois que je le souhaite.

QRGenToFile.java


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

C'est le même que l'exemple de code que j'ai écrit au début, mais c'est beaucoup plus simple Vous n'avez même pas besoin de connaître l'API ZXing, ce qui la rend plus facile à implémenter et à lire.

Voici l'image QR qui a été réellement générée. Si vous ne spécifiez aucune taille, elle semble être 125x125.

qrcode.png

Générer et générer un objet ByteArrayOutputStream

Ensuite, comment créer un objet ByteArrayOutputStream.

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();
}

La quantité de code est plus grande que celle de QRCode # file, Par exemple, ʻImageIO.read (new ByteArrayInputStream (qrCode.toByteArray ())) Cela semble être pratique lorsque vous souhaitez générerBufferedImage` et effectuer une sorte de traitement d'image.

De plus, je ne crée pas de fichier temporaire, donc les performances semblent meilleures.

Sortie vers un objet OutputStream généré

QRCode # stream créait un nouveau OutputStream, Si vous souhaitez écrire une image QR dans un flux de sortie qui a déjà été généré, vous pouvez utiliser QRCode # writeTo.

QRGenToExistingOs.java


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

Il nécessite moins de description que «QRCode # stream».

Sortie en spécifiant diverses valeurs de réglage

Vous pouvez spécifier le format, la taille et la couleur de l'image QR générée. De plus, les paramètres spécifiés dans ʻEncodeHintType` dans ZXing peuvent également être définis via l'objet QRCode.

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);

La valeur spécifiée par withColor est au format transparence (2 octets) + RVB (6 octets).

L'image QR générée est ici.

qrcode.gif

Sortie sous forme de fichier svg

La conversion SVG n'est disponible que pour Java SE. Android n'est pas disponible, mais à la place, vous pouvez afficher des images QR dans ImageView sans génération de fichier Il semble que QRCode # bitmap soit disponible. (Non vérifié cette fois)

QRGenToSvg.java


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

Le qrcode.svg généré s'affichera correctement lorsqu'il sera ouvert dans Chrome, etc.

Lorsque vous êtes préoccupé par la qualité d'image des images QR ou lorsque vous souhaitez étirer et imprimer sur du grand papier C'est utile car vous n'avez pas à préparer une grande image QR.

Essayez différents schémas

Les images QR sont utilisées pour le courrier, les informations de localisation, le Wifi, etc. en plus de l'URL, Il existe également plusieurs objets Schema qui contiennent des informations pour chacun de ces formats de données.

Il semble que README supporte un total de 16 schémas, En regardant le code source, il semble qu'il y en ait en fait quelques autres. Il y a aussi «KddiAu». ~~ Trop conscient! ~~

Schéma d'URL

Un schéma qui contient l'URL d'une page Web. Vous pouvez stocker http ou une chaîne de caractères commençant par https.

Je ne pense pas qu'il soit nécessaire d'alimenter QRCode :: from via cet objet.

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);

Schéma de messagerie

Un schéma qui contient les adresses e-mail. Vous pouvez stocker une chaîne au format «mailto: adresse e-mail».

Pour le moment, vous pouvez écrire new EMail (" mailto: [email protected] "), mais Dans ce cas, le traitement de vérification tel que s'il s'agit d'une chaîne de caractères commençant par mail to: n'est pas effectué, donc Fondamentalement, je pense qu'il est approprié d'utiliser ʻEMail :: parse`.

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);

Lorsque j'ai sélectionné Gmail comme application à lire et à démarrer, l'adresse e-mail intégrée dans l'image QR a été saisie dans À.

Schéma GeoInfo

Un schéma qui contient des informations de localisation. Vous pouvez stocker des chaînes au format «geo: latitude, longitude».

Les images QR sont généralement utilisées lorsque vous souhaitez accéder à des informations Web à partir de magasins, etc., plutôt que de les distribuer sur le site Web. Il est difficile d'imaginer une scène où l'image QR des informations de position est utilisée. Je suis curieux de savoir comment l'utiliser.

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);

Dans le lecteur de code QR utilisé lors de la vérification, les menus «Afficher la carte» et «Rechercher un itinéraire» sont affichés, et Si vous sélectionnez "Afficher la carte", la carte autour des informations de localisation pertinentes sera affichée. Si vous sélectionnez "Rechercher un itinéraire", l'itinéraire entre votre position actuelle et l'emplacement concerné s'affiche sur Google Map.

en conclusion

Ce serait bien si l'image du logo pouvait être placée au centre d'une bonne manière.

Recommended Posts

Java avait une bibliothèque de création de code QR appelée QRGen qui enveloppe bien ZXing, alors je l'ai essayé
[Android] Une histoire qui a trébuché lors de l'introduction de ZXing, une bibliothèque de fonctions de code QR
J'ai eu du mal à faire du multithreading Java à partir de zéro, alors organisez-le
7 choses que je veux que tu gardes pour que ça ne devienne pas un putain de code
Java SE 13 (JSR388) est sorti alors je l'ai essayé
J'ai essayé Tribuo édité par Oracle. Tribuo --Une bibliothèque de prédiction Java (v4.0)
J'ai essayé d'apprendre Java avec une série que les débutants peuvent comprendre clairement