开发一个微信服务号的过程中,有这样一个需求,每一个产品,都要有对应的二维码,而且这个二维码的颜色可以自由控制,所以就想到了zxing包,下载链接:
https://download.csdn.net/download/qq_37928350/10864817
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
/**
* 需求说明:一个推广二维码对应一类考试信息,微信扫码获取报考详情
*
* 需要jar:zxing-code-2.3.jar 下载地址http://download.csdn.net/download/sanfye/8704583
*
*/
public class ErWeiMa {
// 需要注意 颜色码需是16进制字符串
private static final int HUA_SE = 0xFFFF8C00; // 码颜色
private static final int DI_SE = 0xFFEE82EE; // 底色
public static void main(String[] args) {
try {
boolean flag = generateCode("https://www.baidu.com", "aa");
if (flag) {
System.out.println("成功生成二维码");
}
} catch (WriterException | IOException e) {
System.err.println("生成二维码失败");
e.printStackTrace();
}
}
/**
* url对应所需产品url
*
* @param url
* @param jpgName
* 生成二维码名
* @return
* @throws WriterException
* @throws IOException
*/
public static boolean generateCode(String url, String jpgName) throws WriterException, IOException {
String path = "E:/"; // 图片生成的位置
int width = 400;
int height = 400;
String tuJpg = "jpg";
// 设置编码,防止中文乱码
Hashtable<EncodeHintType, Object> ht = new Hashtable<EncodeHintType, Object>();
ht.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 设置二维码参数(编码内容,编码类型,图片宽度,图片高度,格式)
BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, ht);
// 生成二维码(定义二维码输出服务器路径)
File outputFile = new File(path);
if (!outputFile.exists()) {
// 创建文件夹
outputFile.mkdir();
}
int b_width = bitMatrix.getWidth();
int b_height = bitMatrix.getHeight();
// 建立图像缓冲器
BufferedImage image = new BufferedImage(b_width, b_height, BufferedImage.TYPE_3BYTE_BGR);
for (int x = 0; x < b_width; x++) {
for (int y = 0; y < b_height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? HUA_SE : DI_SE);
}
}
// 生成二维码
ImageIO.write(image, tuJpg, new File(path + "/" + jpgName + "." + tuJpg));
// 二维码的名称
// ha.jpg
return true;
}
}
这个就是二维码生成代码啦,但是16进制的颜色字符串怎么来,这还需要一个颜色码与Color对象互转的工具:
import java.awt.Color;
public class YanSeFormat {
// 颜色码转为color对象
public static Color StringToColor(String str) {
int i = Integer.parseInt(str.substring(1), 16);
return new Color(i);
}
/**
* Color对象转换成字符串
*
* @param color
* Color对象
* @return 16进制颜色字符串
*/
private static String toHexFromColor(Color color) {
String r, g, b;
StringBuilder su = new StringBuilder();
r = Integer.toHexString(color.getRed());
g = Integer.toHexString(color.getGreen());
b = Integer.toHexString(color.getBlue());
r = r.length() == 1 ? "0" + r : r;
g = g.length() == 1 ? "0" + g : g;
b = b.length() == 1 ? "0" + b : b;
r = r.toUpperCase();
g = g.toUpperCase();
b = b.toUpperCase();
su.append("0xFF");
su.append(r);
su.append(g);
su.append(b);
return su.toString();
}
/**
* 字符串转换成Color对象
*
* @param colorStr
* 16进制颜色字符串
* @return Color对象
*/
public static Color toColorFromString(String colorStr) {
colorStr = colorStr.substring(4);
Color color = new Color(Integer.parseInt(colorStr, 16));
return color;
}
public static void main(String[] args) {
Color color = StringToColor("#FF8C00"); // 填颜色码
String aa = toHexFromColor(color);
System.err.println(aa);
}
}
需要注意的是,实际环境中,需要保证二维码绑定的url,此处我们url指定的是度娘,用微信扫一扫下面的二维码,就自动去找度娘去啦。