使用Zxing实现二维码生成器内嵌图片
使用Zxing实现二维码生成器内嵌图片,具有一定的参考价值,具体如下:
基本思路是先使用zxing生成的二维码图片,然后读取图片,在其中插入图标,然后整个输出图片。
最近的项目中需要生成二维码,找了几个例子综合下,做出了最后的效果,二维码可以生成图片格式(jpg等)或者在web页面上显示,此片文章仅作记录,雷同之处多多,包涵。。。。
注:需要Zxing包装的工具类,大概的流程是读取内嵌的图片,将内容转化成二维码,将图片内嵌到二维码中,出图。
下面是完整代码:
importJava.awt.BasicStroke;
importjava.awt.Color;
importjava.awt.Graphics2D;
importjava.awt.Image;
importjava.awt.Shape;
importjava.awt.geom.AffineTransform;
importjava.awt.geom.RoundRectangle2D;
importjava.awt.image.AffineTransformOp;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjava.util.HashMap;
importjava.util.Map;
importjavax.imageio.ImageIO;
importcom.google.zxing.BarcodeFormat;
importcom.google.zxing.EncodeHintType;
importcom.google.zxing.MultiFormatWriter;
importcom.google.zxing.WriterException;
importcom.google.zxing.common.BitMatrix;
importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
publicclassZxing{
privatestaticfinalintBLACK=0xFF000000;
privatestaticfinalintWHITE=0xFFFFFFFF;
//图片宽度的一般
privatestaticfinalintIMAGE_WIDTH=80;
privatestaticfinalintIMAGE_HEIGHT=80;
privatestaticfinalintIMAGE_HALF_WIDTH=IMAGE_WIDTH/2;
privatestaticfinalintFRAME_WIDTH=2;
//二维码写码器
privatestaticMultiFormatWritermutiWriter=newMultiFormatWriter();
publicstaticvoidmain(String[]args){
try{
//BitMatrixbitMatrix=multiFormatWriter.encode(content,BarcodeFormat.QR_CODE,400,400,hints);
Stringcontent="13400000000";//二维码的内容
BufferedImageimage=genBarcode(content,400,400,"F:\\amazed.png");
if(!ImageIO.write(image,"jpg",newFile("F:\\2122.jpg"))){
thrownewIOException("Couldnotwriteanimageofformat");
}
/**
//将上面的代码换成此处,使用流读入到页面即可
OutputStreamos=response.getOutputStream();
if(!ImageIO.write(image,"jpg",os)){
thrownewIOException("Couldnotwriteanimageofformat");
}
**/
}catch(WriterExceptione){
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
privateBufferedImagetoBufferedImage(BitMatrixmatrix){
intwidth=matrix.getWidth();
intheight=matrix.getHeight();
BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
for(intx=0;x<width;x++){
for(inty=0;y<height;y++){
image.setRGB(x,y,matrix.get(x,y)?BLACK:WHITE);
}
}
returnimage;
}
privatestaticBufferedImagegenBarcode(Stringcontent,intwidth,
intheight,StringsrcImagePath)throwsWriterException,
IOException{
//读取源图像
BufferedImagescaleImage=scale(srcImagePath,IMAGE_WIDTH,
IMAGE_HEIGHT,true);
int[][]srcPixels=newint[IMAGE_WIDTH][IMAGE_HEIGHT];
for(inti=0;i<scaleImage.getWidth();i++){
for(intj=0;j<scaleImage.getHeight();j++){
srcPixels[i][j]=scaleImage.getRGB(i,j);
}
}
Map<EncodeHintType,Object>hint=newHashMap<EncodeHintType,Object>();
hint.put(EncodeHintType.CHARACTER_SET,"utf-8");//内容编码
hint.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H);//错误等级
hint.put(EncodeHintType.MARGIN,1);//设置二维码外边框的空白区域的宽度
//生成二维码
BitMatrixmatrix=mutiWriter.encode(content,BarcodeFormat.QR_CODE,
width,height,hint);
//二维矩阵转为一维像素数组
inthalfW=matrix.getWidth()/2;
inthalfH=matrix.getHeight()/2;
int[]pixels=newint[width*height];
for(inty=0;y<matrix.getHeight();y++){
for(intx=0;x<matrix.getWidth();x++){
//读取图片
if(x>halfW-IMAGE_HALF_WIDTH
&&x<halfW+IMAGE_HALF_WIDTH
&&y>halfH-IMAGE_HALF_WIDTH
&&y<halfH+IMAGE_HALF_WIDTH){
pixels[y*width+x]=srcPixels[x-halfW
+IMAGE_HALF_WIDTH][y-halfH+IMAGE_HALF_WIDTH];
}
//在图片四周形成边框
elseif((x>halfW-IMAGE_HALF_WIDTH-FRAME_WIDTH
&&x<halfW-IMAGE_HALF_WIDTH+FRAME_WIDTH
&&y>halfH-IMAGE_HALF_WIDTH-FRAME_WIDTH&&y<halfH
+IMAGE_HALF_WIDTH+FRAME_WIDTH)
||(x>halfW+IMAGE_HALF_WIDTH-FRAME_WIDTH
&&x<halfW+IMAGE_HALF_WIDTH+FRAME_WIDTH
&&y>halfH-IMAGE_HALF_WIDTH-FRAME_WIDTH&&y<halfH
+IMAGE_HALF_WIDTH+FRAME_WIDTH)
||(x>halfW-IMAGE_HALF_WIDTH-FRAME_WIDTH
&&x<halfW+IMAGE_HALF_WIDTH+FRAME_WIDTH
&&y>halfH-IMAGE_HALF_WIDTH-FRAME_WIDTH&&y<halfH
-IMAGE_HALF_WIDTH+FRAME_WIDTH)
||(x>halfW-IMAGE_HALF_WIDTH-FRAME_WIDTH
&&x<halfW+IMAGE_HALF_WIDTH+FRAME_WIDTH
&&y>halfH+IMAGE_HALF_WIDTH-FRAME_WIDTH&&y<halfH
+IMAGE_HALF_WIDTH+FRAME_WIDTH)){
pixels[y*width+x]=0xfffffff;
}else{
//此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
pixels[y*width+x]=matrix.get(x,y)?0xff000000
:0xfffffff;
}
}
}
BufferedImageimage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
image.getRaster().setDataElements(0,0,width,height,pixels);
returnimage;
}
/**
*把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标
*
*@paramsrcImageFile
*源文件地址
*@paramheight
*目标高度
*@paramwidth
*目标宽度
*@paramhasFiller
*比例不对时是否需要补白:true为补白;false为不补白;
*@throwsIOException
*/
privatestaticBufferedImagescale(StringsrcImageFile,intheight,
intwidth,booleanhasFiller)throwsIOException{
doubleratio=0.0;//缩放比例
Filefile=newFile(srcImageFile);
BufferedImagesrcImage=ImageIO.read(file);
ImagedestImage=srcImage.getScaledInstance(width,height,
BufferedImage.SCALE_SMOOTH);
//计算比例
if((srcImage.getHeight()>height)||(srcImage.getWidth()>width)){
if(srcImage.getHeight()>srcImage.getWidth()){
ratio=(newInteger(height)).doubleValue()
/srcImage.getHeight();
}else{
ratio=(newInteger(width)).doubleValue()
/srcImage.getWidth();
}
AffineTransformOpop=newAffineTransformOp(
AffineTransform.getScaleInstance(ratio,ratio),null);
destImage=op.filter(srcImage,null);
}
if(hasFiller){//补白
BufferedImageimage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
Graphics2Dgraphic=image.createGraphics();
graphic.setColor(Color.PINK);
graphic.fillRect(10,10,width,height);
graphic.drawRect(100,360,width,height);
if(width==destImage.getWidth(null)){
graphic.drawImage(destImage,0,
(height-destImage.getHeight(null))/2,
destImage.getWidth(null),destImage.getHeight(null),
Color.white,null);
Shapeshape=newRoundRectangle2D.Float(0,(height-destImage.getHeight(null))/2,width,width,20,20);
graphic.setStroke(newBasicStroke(5f));
graphic.draw(shape);
}
else{
graphic.drawImage(destImage,
(width-destImage.getWidth(null))/2,0,
destImage.getWidth(null),destImage.getHeight(null),
Color.white,null);
Shapeshape=newRoundRectangle2D.Float((width-destImage.getWidth(null))/2,0,width,width,20,20);
graphic.setStroke(newBasicStroke(5f));
graphic.draw(shape);
}
graphic.dispose();
destImage=image;
}
return(BufferedImage)destImage;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。