生成二维码案例
1.引入依赖
<!-- zxing生成二维码 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
2.生成二维码工具包
public class QRCodeUtil {
private static final Logger log= LoggerFactory . getLogger ( QRCodeUtil . class ) ;
private static final int CODE_WIDTH = 400 ;
private static final int CODE_HEIGHT = 400 ;
private static final int FRONT_COLOR = 0x000000 ;
private static final int BACKGROUND_COLOR = 0xFFFFFF ;
public static void createCodeToFile ( String content, File codeImgFileSaveDir, String fileName) {
try {
if ( StringUtils . isBlank ( content) || StringUtils . isBlank ( fileName) ) {
return ;
}
content = content. trim ( ) ;
if ( codeImgFileSaveDir== null || codeImgFileSaveDir. isFile ( ) ) {
codeImgFileSaveDir = FileSystemView . getFileSystemView ( ) . getHomeDirectory ( ) ;
}
if ( ! codeImgFileSaveDir. exists ( ) ) {
codeImgFileSaveDir. mkdirs ( ) ;
}
BufferedImage bufferedImage = getBufferedImage ( content) ;
File codeImgFile = new File ( codeImgFileSaveDir, fileName) ;
ImageIO . write ( bufferedImage, "png" , codeImgFile) ;
log. info ( "二维码图片生成成功:" + codeImgFile. getPath ( ) ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
public static void createCodeToOutputStream ( String content, OutputStream outputStream) {
try {
if ( StringUtils . isBlank ( content) ) {
return ;
}
content = content. trim ( ) ;
BufferedImage bufferedImage = getBufferedImage ( content) ;
addQrCodeLogo ( bufferedImage, new File ( "E://shFiles//QRCode//20231213151849.png" ) ) ;
ImageIO . write ( bufferedImage, "png" , outputStream) ;
log. info ( "二维码图片生成到输出流成功..." ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
private static BufferedImage getBufferedImage ( String content) throws WriterException {
Map < EncodeHintType , Object > hints = new HashMap ( ) ;
hints. put ( EncodeHintType . CHARACTER_SET , "UTF-8" ) ;
hints. put ( EncodeHintType . ERROR_CORRECTION , ErrorCorrectionLevel. M ) ;
hints. put ( EncodeHintType . MARGIN , 1 ) ;
MultiFormatWriter multiFormatWriter = new MultiFormatWriter ( ) ;
BitMatrix bitMatrix = multiFormatWriter. encode ( content, BarcodeFormat . QR_CODE , CODE_WIDTH , CODE_HEIGHT , hints) ;
BufferedImage bufferedImage = new BufferedImage ( CODE_WIDTH , CODE_HEIGHT , BufferedImage . TYPE_INT_BGR ) ;
for ( int x = 0 ; x < CODE_WIDTH ; x++ ) {
for ( int y = 0 ; y < CODE_HEIGHT ; y++ ) {
bufferedImage. setRGB ( x, y, bitMatrix. get ( x, y) ? FRONT_COLOR : BACKGROUND_COLOR ) ;
}
}
return bufferedImage;
}
public static void downFile ( String url, String fileName, HttpServletRequest request, HttpServletResponse response) {
try {
response. setContentType ( "multipart/form-data" ) ;
response. setHeader ( "Content-Disposition" , "attachment;filename=" + new String ( fileName. getBytes ( "UTF-8" ) , "ISO-8859-1" ) ) ;
File file = new File ( url+ fileName) ;
FileInputStream in = new FileInputStream ( file) ;
OutputStream out = new BufferedOutputStream ( response. getOutputStream ( ) ) ;
int b = 0 ;
byte [ ] buffer = new byte [ 2048 ] ;
while ( ( b= in. read ( buffer) ) != - 1 ) {
out. write ( buffer, 0 , b) ;
}
in. close ( ) ;
out. flush ( ) ;
out. close ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
public static BufferedImage addQrCodeLogo ( BufferedImage bufferedImage, File logoFile) throws IOException {
Graphics2D graphics = bufferedImage. createGraphics ( ) ;
int matrixWidth = bufferedImage. getWidth ( ) ;
int matrixHeigh = bufferedImage. getHeight ( ) ;
BufferedImage logo = ImageIO . read ( logoFile) ;
int logoWidth = logo. getWidth ( ) ;
int logoHeight = logo. getHeight ( ) ;
int x = bufferedImage. getWidth ( ) / 5 * 2 ;
int y = bufferedImage. getHeight ( ) / 5 * 2 ;
int width = matrixWidth / 5 ;
int height = matrixHeigh / 5 ;
graphics. drawImage ( logo, x, y, width, height, null ) ;
graphics. drawRoundRect ( x, y, logoWidth, logoHeight, 15 , 15 ) ;
graphics. setStroke ( new BasicStroke ( 5.0F , 1 , 1 ) ) ;
graphics. setColor ( Color . white) ;
graphics. drawRect ( x, y, logoWidth, logoHeight) ;
graphics. dispose ( ) ;
bufferedImage. flush ( ) ;
return bufferedImage;
}
}
3.Controller 中调用生成二维码工具包
@RestController
@RequestMapping ( "/qrCode" )
public class QrCodeController {
private static final String RootPath = "H:\\shFiles\\QRCode" ;
private static final String FileFormat = ".png" ;
private static final ThreadLocal < SimpleDateFormat > LOCALDATEFORMAT = ThreadLocal . withInitial ( ( ) -> new SimpleDateFormat ( "yyyyMMddHHmmss" ) ) ;
@PostMapping ( "generate/file" )
public AjaxResult generateV1 ( String content) {
try {
final String fileName= LOCALDATEFORMAT . get ( ) . format ( new Date ( ) ) ;
File file = null ;
QRCodeUtil . createCodeToFile ( content, file, fileName+ FileFormat ) ;
} catch ( Exception e) {
return AjaxResult . error ( e. getMessage ( ) ) ;
}
return AjaxResult . success ( ) ;
}
@PostMapping ( "generate/img" )
public AjaxResult generateV2 ( String content, HttpServletResponse servletResponse) {
try {
QRCodeUtil . createCodeToOutputStream ( content, servletResponse. getOutputStream ( ) ) ;
} catch ( Exception e) {
return AjaxResult . error ( e. getMessage ( ) ) ;
}
return AjaxResult . success ( ) ;
}
}
4.在postman测试