背景:最近一个项目的会员模块,需要将会员手机号码转换成条形码展示出来,并保证能够被扫码枪识别。
接着,简要说明下编码思路,或者说步骤:
- 引入 aspose.barcode 的Jar依赖
- 调用API,合理配置相关属性,生成条形码
- 根据需要对第2步的图片进行一轮裁剪
- 将图片以二进制流的方式上传至七牛云
- 拼接条形码的访问链接URL
- 引入Jar依赖(maven)
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>http://artifact.aspose.com/repo/</url>
</repository>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-barcode</artifactId>
<version>18.12</version>
</dependency>
- Java代码实现条形码生成、图片裁剪、上传和返回图片访问URL
/**
* @return java.awt.image.BufferedImage
* @throws
* @description 借助 aspose.barcode API,获取BufferedImage实例(图片裁剪)
* @params [text]
*/
private static BufferedImage getBufferedImage(String text) {
// set code text & encoding type
BarCodeGenerator generator = new BarCodeGenerator(EncodeTypes.CODE_128, text);
// format label
generator.getCodeTextStyle().setLocation(CodeLocation.ABOVE);
generator.getCodeTextStyle().setColor(new Color(153, 153, 153));
generator.setForeColor(new Color(111, 108, 111));
generator.setBackColor(Color.WHITE);
BufferedImage bufferedImage = generator.generateBarCodeImage();
bufferedImage.flush();
return bufferedImage.getSubimage(2, 10, 249, 151); // // the size for CodeLocation.ABOVE
// return bufferedImage.getSubimage(2, 11, 249, 148); // the size for CodeLocation.BELOW
}
/**
* @return java.lang.String
* @throws
* @description 生成条形码并上传至七牛云
* @params [text]
*/
public String generateBarCodeAndUpload(String text) throws IOException {
// set code text & encoding type
BufferedImage subImage = getBufferedImage(text);
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 生成二维码 => 图片写入字节输出流
ImageIO.write(subImage, "png", os);
String domainAndKey = qiniuUploadUtils.uploadFilesViaServer(os);
logger.info("BarcodeUtils.generateBarCodeAndUpload ========= 域名+Key:{} ========= ", domainAndKey);
if (StringUtils.isNotBlank(domainAndKey)) {
String[] dKeyArray = domainAndKey.split(",");
return "http://" + dKeyArray[0] + "/" + dKeyArray[1];
} else {
logger.info("BarcodeUtils.generateBarCodeAndUpload ======== 条形码生成错误,请稍后重试!========");
throw new CommonBusinessException("条形码生成错误,请稍后重试!");
}
}
/**
* @return void
* @throws
* @description 七牛云通过服务端上传文件(使用数据流传输)
* @params [os]
*/
public String uploadFilesViaServer(ByteArrayOutputStream os) {
String retKey = "";
// 构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone2());
UploadManager uploadManager = new UploadManager(cfg);
String uuid = UUID.randomUUID().toString();
// 等同于文件名
String key = uuid.replace("-", "") + ".jpg";
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
// 接收字节输出流,然后转换为字节输入流
InputStream byteInputStream = new ByteArrayInputStream(os.toByteArray());
try {
Response response = uploadManager.put(byteInputStream, key, upToken, null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
retKey = putRet.key;
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return domain + "," + retKey;
}