Votre propre QRCode avec votre logo

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=&quot;&quot;>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 &#39; »./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;
    }
}

C’est après avoir fait fonctionner mon code, belle n’est-ce pas??

Leave Comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *