Croyez-le ou non, je fais ma propre entreprise? cela signifie aussi que je pensais à une carte de visite et d’être un gars informatique en plus de mon sens du coaching, j’ai pensé à numérique!
J’ai donc cherché un QRCode personnalisé, et je vais fournir ici ce que j’ai fait et peut-être quelqu’un d’autre sera également inspiré.
Après une recherche rapide google, j’ai trouvé zxing. Au fond, il s’agit d’une bibliothèque Java pure pour décoder les codes-barres (le noyau / et javase / modules). Il contient également plusieurs applications pour Android, Google Glass, une application Web JavaEE, et une application encoder basée sur GWT.
Mon idée initiale était de combiner la carte v avec QRcode, la principale restriction après quelques recherches est la limitation apportée par le QRCode en termes de quantité de données.
Bien sûr, vous pouvez payer pour cela, mais je vais fournir un petit morceau de code pour générer un pou
r vous. Voici le générateur QRCode, bien sûr, pour le rendre plus robuste, un travail supplémentaire serait nécessaire, mais l’esprit est là, et c’est mon objectif.
paquet lu.acsolutions.QRCode;
importation java.awt.AlphaComposite;
importation java.awt.Graphics2D;
importation java.awt.Image;
importation java.awt.image.BufferedImage;
importation java.io.ByteArrayInputStream;
importation java.io.ByteArrayOutputStream;
importation java.io.File;
importation java.io.IOException;
importation java.net.URL;
importation java.nio.file.FileVisitOption;
importation java.nio.file.Files;
importation java.nio.file.Path;
importation java.nio.file.Paths;
importation java.nio.file.StandardCopyOption;
importation java.util.Comparator;
importation java.util.HashMap;
importation java.util.Map;
importation java.util.Random;
importation javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
classe publique QRCodeGenerator
DIR à cordes privées;
ext string privé;
LOGO string privé;
content de la chaîne privée;
privé int WIDTH;
int HEIGHT privé;
vide public générer()
Créer une nouvelle configuration qui spécifie la correction d’erreur, ci-dessous est élevé
qui fournissent le meilleur
Le lecteur QRCode travaillera plus facilement.
<EncodeHintType, errorcorrectionlevel="">Conseils de carte - nouveau HashMap <> ();</EncodeHintType,>
hints.put (EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
QRCodeWriter écrivain - nouveau QRCodeWriter();
BitMatrix bitMatrix - nul;
ByteArrayOutputStream os - nouveau ByteArrayOutputStream();
essayer
annuaire init
cleanDirectory (DIR);
initDirectory (DIR);
/*
Code ci-dessous, j’ai utilisé pour vérifier en conséquence la quantité de données, qui
La version n’a pas vraiment été importante, c’était un débbug rapide pour moi.
*
QRCode qrcode - com.google.zxing.qrcode.encoder.Encoder.encode (CONTENT,
ErreurCorrectionLevel.L); int qrCodeVersion
qrcode.getVersion ().getVersionNumber();
System.out.println (« bonjour c’est la version: »
Integer.toString (qrCodeVersion);
*/
Créer un code qr avec l’URL comme contenu et une taille de Px WxH
bitMatrix - writer.encode (CONTENT, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
Image QR de chargement
BufferedImage qrImage - MatrixToImageWriter.toBufferedImage(bitMatrix, getMatrixConfig);
Image de logo de charge
BufferedImage trop - getOverly (LOGO);
Resize pour être plus petit que le QRCode, en effet mon premier test a été un avec un logo
qui était encore plus grand que mon QRCode
il est intégré à mon code, mais pourrait être facilement devenir une propriété pour le
Classe.
trop -resize (trop, qrImage.getHeight() / 4, qrImage.getWidth() / 4);
Calculer la hauteur et la largeur du delta entre le code QR et le logo
int deltaHeight - qrImage.getHeight() - overly.getHeight();
int deltaWidth - qrImage.getWidth() - overly.getWidth();
Initialiser l’image combinée
BufferedImage combiné - nouveau BufferedImage (qrImage.getHeight(), qrImage.getWidth(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g (Graphics2D) combined.getGraphics();
Écrire du code QR à une nouvelle image à la position 0/0
g.drawImage (qrImage, 0, 0, null);
g.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_OVER, 1f);
Écrivez le logo en combinaison image en position (deltaWidth / 2) et
(deltaHeight / 2). Contexte : Gauche/Droite et Haut/Bas doit être
le même espace pour que le logo soit centré
g.drawImage (overly, (int) Math.round (deltaWidth / 2), (int) Math.round (deltaHeight / 2), null);
Écrivez l’image combinée comme PNG à OutputStream
ImageIO.write (combiné, « png », os);
Image de magasin
Files.copy (nouveau ByteArrayInputStream(os.toByteArray)),
Paths.get (DIR - generateRandoTitle (nouveau Random(), 9) et ext), StandardCopyOption.REPLACE_EXISTING);
- capture (WriterException e)
e.printStackTrace();
LOG.error (« WriterException occurred », e);
- capture (IOException e)
e.printStackTrace();
LOG.error (« IOException occurred », e);
}
}
chaîne publique getDIR ()
retour DIR;
}
le vide public setDIR (String dIR)
DIR et dIR;
}
chaîne publique getExt ()
ext retour;
}
set de vide publicExt(String ext)
this.ext et ext;
}
chaîne publique getLOGO ()
retourner LOGO;
}
setLOGO (String lOGO)
LOGO et lOGO;
}
chaîne publique getCONTENT ()
retour CONTENT;
}
setCONTENT (String cONTENT)
CONTENT et cONTENT;
}
public int getWIDTH ()
retour WIDTH;
}
le vide public setWIDTH (int wIDTH)
WIDTH et wIDTH;
}
public int getHEIGHT()
retour HEIGHT;
}
setHEIGHT (int hEIGHT)
HEIGHT et hEIGHT;
}
privé BufferedImage getOverly (String LOGO) jette IOException
URL et nouvelle URL (LOGO);
retour ImageIO.read (url);
}
public BufferedImage resize (BufferedImage img, int height, int width)
Image tmp - img.getScaledInstance (largeur, hauteur, Image.SCALE_SMOOTH);
BufferedImage resized - new BufferedImage (largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
Graphiques2D g2d - resized.createGraphics();
g2d.drawImage (tmp, 0, 0, null);
g2d.dispose ();
retour resized;
}
vide privé initDirectory (String DIR) jette IOException
Files.createDirectories (Paths.get(DIR);
}
vide privé cleanDirectory (String DIR)
essayer
Files.walk(Paths.get(DIR), FileVisitOption.FOLLOW_LINKS).tried(Comparator.reverseOrder()).map(Path:toFile)
.forEach (File::delete);
- capture (IOException e)
L’annuaire n’existe pas, ne rien faire
}
}
privé MatrixToImageConfig getMatrixConfig ()
Couleurs ARGB
Vérifier couleurs ENUM
retour nouvelle MatrixToImageConfig (Colors.PURPLE.getArgb(), Colors.BLACK.getArgb();
}
chaîne privée generateRandoTitle (Random aléatoire, longueur int)
retour random.ints(48, 122).filter (i -) < 57 || i > (i 65) (i < 90 || i > 97)).mapToObj(i -) (char) i)
.limit(length).collect(StringBuilder:: new, StringBuilder::append, StringBuilder::append).toString();
}
}
Maintenant, la classe principale, dans celui-ci, j’ai effectivement utiliser la carte v de ezvcard pour configurer les propriétés ad hoc.
paquet lu.acsolutions.QRCode;
importation ezvcard. Ezvcard;
importation ezvcard. VCard;
importez ezvcard.parameter.EmailType;
importez ezvcard.parameter.ImageType;
importation ezvcard.parameter.TelephoneType;
importation ezvcard.property.Logo;
importation ezvcard.property.Organisation;
importation ezvcard.property.Photo;
importation ezvcard.property.StructuredName;
importation ezvcard.property.Téléphone;
importation ezvcard.property.Uid;
importation ezvcard.util.TelUri;
classe publique GenerateQRCode
privé statique finale String QR_CODE_IMAGE_PATH ' »./MyQRCode/ »;
Bien sûr, ce ci-dessous devra être changé en conséquence, sinon vous allez avoir mon propre logo;-)
QR_CODE_LOGO de cordes finales statiques privées et « https://acsolutions.lu/wp-content/uploads/2019/08/AC-Soutions2.jpg »;
vide statique public principal (Ar[]gs string)
TODO Méthode auto-générée talon
QRCodeGenerator qrCode - nouveau QRCodeGenerator();
VCard vcard - nouvelle VCard();
StructuredName n - nouveau StructuredName();
n.setFamily (« Claus »);
n.setGiven (« Alexandre »);
n.getPrefixes ().ajouter(« M. »);
vcard.setStructuredName(n);
vcard.setFormattedName (« Alexandre Claus »);
TelUri uri - nouveau TelUri.Builder (« xxx-xxxxxxxx »).build();
Téléphone tél. - nouveau téléphone(uri);
tel.getTypes().add(PhoneType.CELL);
vcard.addTelephoneNumber (tél.);
vcard.addUrl (« http://www.acsolutions.lu »);
générer un UID aléatoire
Uid uid - Uid.random();
vcard.setUid (uid);
Photo photo - nouvelle photo (« https://acsolutions.lu/wp-content/uploads/2019/07/AC.png », ImageType.JPEG);
vcard.addPhoto(photo);
vcard.addEmail (« alexandre.claus@gmail.com », EmailType.HOME);
vcard.addEmail (« alexandre.claus@acsolutions.lu », EmailType.WORK);
Logo logo - nouveau Logo (« https://acsolutions.lu/wp-content/uploads/2019/08/AC-Soutions2.jpg », ImageType.JPEG);
vcard.addLogo (logo);
Organisation org - nouvelle Organisation();
org.getValues ().add(Agile - Coaching Solutions »);
org.getValues ().add(Co-founder »);
vcard.setOrganisation(org);
System.out.println (Ezvcard.write(vcard).go);
qrCode.setDIR (QR_CODE_IMAGE_PATH);
qrCode.setCONTENT (Ezvcard.write(vcard).go);
qrCode.setExt (« .jpg »);
qrCode.setHEIGHT(300);
qrCode.setWIDTH(300);
qrCode.setLOGO (QR_CODE_LOGO);
Maintenant, nous produisons!
qrCode.generate();
}
}
J’ai presque oublié, vous aurez aussi besoin de cette petite classe enum, afin de définir les couleurs, cela peut facilement être adapté à votre propre but.
paquet lu.acsolutions.QRCode;
enum Couleurs
BLUE(0xFF40BAD0),
RED(0xFFE91C43),
PURPLE(0xFF8A4F9E),
ORANGE(0xFFF4B13D),
WHITE(0xFFFFFFFF),
BLACK(0xFF000000);
finale privée int argb;
Couleurs (finale int argb))
this.argb et argb;
}
public int getArgb()
retour argb;
}
}
