背景
考拉组件化后,为了简化编译流程,使用python
实现了源码依赖编译构建平台,提供二维码扫码下载功能;考拉首页动态化搭建后台需要提供少码预览功能等。
二维码功能在后端开发中很常见,本文总结如何在后端项目中快速支持二维码,让自己的平台瞬间高大上。
python
二维码生成
使用 qrcode
模块快速支持二维码
安装依赖
`pip install qrcode`
二维码处理
1 2 3 4 5 6 7 8 9 10 11
| class QRCodeHandler(BaseHandler): def get(self): data = self.get_argument("data", None) if data: img = qrcode.make(data) output = StringIO.StringIO() img.save(output) self.set_header("Content-Type", "image/png") self.write(output.getvalue()) else: self.write('请输入data参数')
|
注:更多高级用法请参看开发者官网–qrcode, 如二维码中添加应用图标等
配置接口
1 2 3 4
| handlers = [ ...... (r"/qrcode", QRCodeHandler), ]
|
spring 项目中二维码支持
添加依赖
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency>
|
二维码处理工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| import com.google.zxing.*; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID;
public class QrcodeUtil {
/** * 解析二维码解析 */ public static String analyzeEncode(String path) { String content = null; BufferedImage image; try { image = ImageIO.read(new File(path)); LuminanceSource source = new BufferedImageLuminanceSource(image); Binarizer binarizer = new HybridBinarizer(source); BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer); Map<DecodeHintType, Object> hints = new HashMap<>(); hints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码 content = result.getText(); } catch (IOException | NotFoundException e) { e.printStackTrace(); } return content; }
/** * 生成二维码 */ public static String getEncode(String content, int size) throws Exception { if (size < 200) { size = 200; } String projectPath = new File("").getAbsolutePath(); String filepath = projectPath + File.separator + "qrcode" + File.separator; File f = new File(filepath); if (!f.exists()) { f.mkdirs(); } String fileAbsolutePath = filepath + randomId() + ".png"; String format = "png";// 图像类型 Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, size, size, hints);// 生成矩阵 Path path1 = Paths.get(fileAbsolutePath); System.out.println(fileAbsolutePath); MatrixToImageWriter.writeToPath(bitMatrix, format, path1);// 输出图像 return fileAbsolutePath; }
private static String randomId() { return UUID.randomUUID().toString().replaceAll("-", "") + "_" + new Date().getTime(); } }
|
服务层接口定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public interface IQrcodeService {
/** * 用于生成二维码图片 * * @param data 要生成二维码图片的内容,如文件地址等 * @param size 二维码图片尺寸(正方形) * @return 二维码图片地址 */ String generateQrcode(String data, int size);
/** * 解析二维码内容 * * @param path 二维码图片地址 * @return 二维码内容 */ String analyzeQrcode(String path);
/** * 删除存放在本地的二维码图片 * * @param path 本地存储路径 * @return 是否删除成功 */ boolean deleteQrcode(String path); }
|
服务层实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import org.springframework.stereotype.Service;
import java.io.File;
@Service public class QrcodeService implements IQrcodeService {
@Override public String generateQrcode(String data, int size) { try { return QrcodeUtil.getEncode(data, size); } catch (Exception e) { e.printStackTrace(); return ""; } }
@Override public String analyzeQrcode(String path) { return QrcodeUtil.analyzeEncode(path); }
@Override public boolean deleteQrcode(String path) { File file = new File(path); if (file.exists()) { return file.delete(); } return false; } }
|
使用以上配置可简单快速实现二维码生成和二维码信息解码工作,实现方式仅作参考
总结
分别使用 python
和 java
实现二维码功能,方便今后快速集成。