`

批量生成带LOGO的二维码图片

    博客分类:
  • java
 
阅读更多
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 加载TXT文件
 * @author mukeliang
 * 2014年9月15日
 */
public class LoaderTxtFile {
	/**
	 * 功能:Java读取txt文件的内容
	 * 步骤:1:先获得文件句柄
	 * 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
	 * 3:读取到输入流后,需要读取生成字节流
	 * 4:一行一行的输出。readline()。
	 * 备注:需要考虑的是异常情况
	 * @param filePath
	 */
	public static List<String> readTxtFile(String filePath){
		List<String> list = new ArrayList<String>();
		
		try {
			
			String encoding="GBK";
			File file=new File(filePath);
			if(file.isFile() && file.exists()){ //判断文件是否存在
				InputStreamReader read = new InputStreamReader(
						new FileInputStream(file),encoding);//考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				
				while((lineTxt = bufferedReader.readLine()) != null){
					System.out.println(lineTxt);
					list.add(lineTxt);
				}
				read.close();
			}else{
				System.out.println("找不到指定的文件");
			}
			
			
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
			e.printStackTrace();
		}
		
		return list;

	}

	public static void main(String argv[]){
		String filePath = "d:\\test.txt";
		// "res/";
		readTxtFile(filePath);
	}

}

 

import java.awt.image.BufferedImage; 

import jp.sourceforge.qrcode.data.QRCodeImage; 

public class TwoDimensionCodeImage implements QRCodeImage { 
    BufferedImage bufImg; 

    public TwoDimensionCodeImage(BufferedImage bufImg) { 
        this.bufImg = bufImg; 
    } 

    @Override 
    public int getHeight() { 
        return bufImg.getHeight(); 
    } 

    @Override 
    public int getPixel(int x, int y) { 
        return bufImg.getRGB(x, y); 
    } 

    @Override 
    public int getWidth() { 
        return bufImg.getWidth(); 
    } 

}

 

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.util.List;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

import com.swetake.util.Qrcode;

public class TwoDimensionCode { 

    /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param imgPath 图片路径 
     */ 
    public void encoderQRCode(String content, String imgPath) { 
        this.encoderQRCode(content, imgPath, "png", 7); 
    } 

    /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param output 输出流 
     */ 
    public void encoderQRCode(String content, OutputStream output) { 
        this.encoderQRCode(content, output, "png", 7); 
    } 

    /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param imgPath 图片路径 
     * @param imgType 图片类型 
     */ 
    public void encoderQRCode(String content, String imgPath, String imgType) { 
        this.encoderQRCode(content, imgPath, imgType, 7); 
    } 

    /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param output 输出流 
     * @param imgType 图片类型 
     */ 
    public void encoderQRCode(String content, OutputStream output, String imgType) { 
        this.encoderQRCode(content, output, imgType, 7); 
    } 

    /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param imgPath 图片路径 
     * @param imgType 图片类型 
     * @param size 二维码尺寸 
     */ 
    public void encoderQRCode(String content, String imgPath, String imgType, int size) { 
        try { 
            BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 

            File imgFile = new File(imgPath); 
            // 生成二维码QRCode图片  
            ImageIO.write(bufImg, imgType, imgFile); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

    /** 
     * 生成二维码(QRCode)图片 
     * @param content 存储内容 
     * @param output 输出流 
     * @param imgType 图片类型 
     * @param size 二维码尺寸 
     */ 
    public void encoderQRCode(String content, OutputStream output, String imgType, int size) { 
        try { 
            BufferedImage bufImg = this.qRCodeCommon(content, imgType, size); 
            // 生成二维码QRCode图片  
            ImageIO.write(bufImg, imgType, output); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

    /** 
     * 生成二维码(QRCode)图片的公共方法 
     * 没有LOGO图片的情况
     * @param content 存储内容 
     * @param imgType 图片类型 
     * @param size 二维码尺寸 
     * @return 
     */ 
    private BufferedImage qRCodeCommonBak(String content, String imgType, int size) { 
        BufferedImage bufImg = null; 
        try { 
            Qrcode qrcodeHandler = new Qrcode(); 
            // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小  
            qrcodeHandler.setQrcodeErrorCorrect('M'); 
            qrcodeHandler.setQrcodeEncodeMode('B'); 
            // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大  
            qrcodeHandler.setQrcodeVersion(size); 
            // 获得内容的字节数组,设置编码格式  
            byte[] contentBytes = content.getBytes("utf-8"); 
            // 图片尺寸  
            int imgSize = 67 + 12 * (size - 1); 
            bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB); 
            Graphics2D gs = bufImg.createGraphics(); 
            // 设置背景颜色  
            gs.setBackground(Color.WHITE); 
            gs.clearRect(0, 0, imgSize, imgSize); 
            String logoPath = "images/logo.png";
            Image img = ImageIO.read(new File(logoPath));// 实例化一个Image对象。
			gs.drawImage(img, 10, 10, null);

            // 设定图像颜色> BLACK  
            gs.setColor(Color.BLACK); 
            // 设置偏移量,不设置可能导致解析出错  
            int pixoff = 2; 
            // 输出内容> 二维码  
            if (contentBytes.length > 0 && contentBytes.length < 800) { 
                boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); 
                for (int i = 0; i < codeOut.length; i++) { 
                    for (int j = 0; j < codeOut.length; j++) { 
                        if (codeOut[j][i]) { 
                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); 
                        } 
                    } 
                } 
            } else { 
                throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800]."); 
            } 
            gs.dispose(); 
            bufImg.flush(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return bufImg; 
    } 
    
    /**
     * 有LOGO图片的情况
     * @param content
     * @param imgType
     * @param size
     * @return
     */
    private BufferedImage qRCodeCommon(String content, String imgType, int size) { 
        BufferedImage bufImg = null; 
        try { 
        	Qrcode qrcodeHandler = new Qrcode();
			// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
			qrcodeHandler.setQrcodeErrorCorrect('M');
			// N代表数字,A代表字符a-Z,B代表其他字符
			qrcodeHandler.setQrcodeEncodeMode('B');
			// 设置设置二维码版本,取值范围1-40,值越大尺寸越大,可存储的信息越大
			qrcodeHandler.setQrcodeVersion(8);

			byte[] contentBytes = content.getBytes("utf-8");
			bufImg = new BufferedImage(149, 149,
					BufferedImage.TYPE_INT_RGB);
			Graphics2D gs = bufImg.createGraphics();

			gs.setBackground(Color.WHITE);
			gs.clearRect(0, 0, 149, 149);

			// 设定图像颜色 > BLACK
			gs.setColor(Color.BLACK);

			// 设置偏移量 不设置可能导致解析出错
			int pixoff = 2;
			// 输出内容 > 二维码
			if (contentBytes.length > 0 && contentBytes.length < 150) {
				boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
				for (int i = 0; i < codeOut.length; i++) {
					for (int j = 0; j < codeOut.length; j++) {
						if (codeOut[j][i]) {
							gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
						}
					}
				}
			} else {
				System.err.println("QRCode content bytes length = "
						+ contentBytes.length + " not in [ 0,125]. ");
				return null;
			}
			
			String logoPath = "d:\\TwoDimension\\logo.png";
//			String logoPath = "images/logo.png";
			Image img = ImageIO.read(new File(logoPath));// 实例化一个Image对象。
			gs.drawImage(img, 50, 50, null);
			gs.dispose();
			bufImg.flush();
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return bufImg; 
    } 

    /** 
     * 解析二维码(QRCode) 
     * @param input 输入流 
     * @return 
     */ 
    public String decoderQRCode(InputStream input) { 
        BufferedImage bufImg = null; 
        String content = null; 
        try { 
            bufImg = ImageIO.read(input); 
            QRCodeDecoder decoder = new QRCodeDecoder(); 
            content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8"); 
        } catch (IOException e) { 
            System.out.println("Error: " + e.getMessage()); 
            e.printStackTrace(); 
        } catch (DecodingFailedException dfe) { 
            System.out.println("Error: " + dfe.getMessage()); 
            dfe.printStackTrace(); 
        } 
        return content; 
    }
    
    public static void main(String[] args) throws Exception { 
    	String filePath = "D:\\TwoDimension\\sourcefile\\sourceurl.txt";
    	
    	List sourceFileList = LoaderTxtFile.readTxtFile(filePath);
    	for(int j=0;j<sourceFileList.size();j++){
    		
    		//解析sourceurl.txt文件中的数据,并生成对应的目录,用以存放生成的二维码数据
    		String sourceFile = (String)sourceFileList.get(j);
    		
    		//D:\TwoDimension\sourcefile\126\126.txt
    		String[] tempAarray = sourceFile.split("\\\\");
    		
    		//取出126目录
    		String generateDir = tempAarray[3];
    		
    		//D:\\TwoDimension\\targetfile\\126\\
    		String targetPath = "D:\\TwoDimension\\targetfile\\" + generateDir + "\\";
    		File file = new File(targetPath);
    		if(!file.exists()){
    			file.mkdir();
    		}
    		
    		
    		//解析数据文件中的URL地址,生成二维码
    		List sourceDataList = LoaderTxtFile.readTxtFile(sourceFile);
        	
        	for(int i=0;i<sourceDataList.size();i++){
        		
        		String encodeUrlAddress = (String)sourceDataList.get(i);
        		
        		//从 http://www.51art.com/jingmai/A831001 中,取出拍品编号
        		String auctionNo = encodeUrlAddress.substring(encodeUrlAddress.lastIndexOf("/")+1);
        		
        		//D:\\TwoDimension\\targetfile\\126\\A831001.png
                String imgPath = targetPath + auctionNo+".png";
                
                //生成二维码
                TwoDimensionCode handler = new TwoDimensionCode(); 
                handler.encoderQRCode(encodeUrlAddress, imgPath, "png"); 


                //将二维码解析成对应的数据
                String decoderContent = handler.decoderQRCode(new FileInputStream(imgPath)); 
                System.out.println(decoderContent); 
                
        	}
    	}
    	
    	System.out.println("========================完成=========================");
    	
    } 
  
} 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics