一个Java实现的把指定字符串生成二维码并保存成图片的代码

package qrCode;


import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  
import javax.imageio.ImageIO;  
import jp.sourceforge.qrcode.QRCodeDecoder;  
import jp.sourceforge.qrcode.data.QRCodeImage;  
  
public class GucasQRCodeDecoder {  
    public GucasQRCodeDecoder() {  
          
    }  
      
    /** 
     * decode qrcode image. 
     * @param qrcodePicfilePath 
     * @return decoding value. 
     */  
    public static String decode(String qrcodePicfilePath) {  
        File imageFile = new File(qrcodePicfilePath);  
        BufferedImage image = null;  
        try {  
            image = ImageIO.read(imageFile);  
        } catch (IOException e) {  
            System.out.println("Decoding failed, read QRCode image error: " + e.getMessage());  
            return null;  
        }  
        /* 
        try { 
            String decodedData = new String(decoder.decode(new J2SEImageGucas(image)), "GBK"); 
            System.out.println(decodedData); 
        } catch (DecodingFailedException dfe) { 
            System.out.println("Error: " + dfe.getMessage()); 
        } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
        } 
        */  
        QRCodeDecoder decoder = new QRCodeDecoder();  
        String decodedData = new String(decoder.decode(new J2SEImageGucas(image)));  
        return decodedData;  
    }  
  
    public static void main(String[] args) {  
        QRCodeDecoder decoder = new QRCodeDecoder();  
        File imageFile = new File("qrcode//TestQRCode.png");  
        BufferedImage image = null;  
        try {  
            image = ImageIO.read(imageFile);  
        } catch (IOException e) {  
            System.out.println("Error: " + e.getMessage());  
        }  
          
        String decodedData = new String(decoder.decode(new J2SEImageGucas(image)));  
        System.out.println(decodedData);  
    }  
}  
  
class J2SEImageGucas implements QRCodeImage {  
    BufferedImage image;  
  
    public J2SEImageGucas(BufferedImage image) {  
        this.image = image;  
    }  
  
    public int getWidth() {  
        return image.getWidth();  
    }  
  
    public int getHeight() {  
        return image.getHeight();  
    }  
  
    public int getPixel(int x, int y) {  
        return image.getRGB(x, y);  
    }  
}  


package qrCode;



import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  
  
import javax.imageio.ImageIO;  
import com.swetake.util.Qrcode;  
  
public class GucasQRCodeEncoder {  
      
    public static int max_data_size_small = 84;  
    public static int max_data_size_large = 500;  
      
    /** 
     *  
     * @param srcValue 
     * @param qrcodePicfilePath 
     * @return 
     */  
    public static boolean encode(String srcValue, String qrcodePicfilePath) {  
        return  encode_84(srcValue, qrcodePicfilePath);  
    }  
      
    /** 
     * Encoding the information to a QRCode, size of the information must be less than 84 byte. 
     * @param srcValue 
     * @param qrcodePicfilePath 
     * @return 
     */  
    public static boolean encode_84(String srcValue, String qrcodePicfilePath) {  
        int MAX_DATA_LENGTH = max_data_size_small; // the max size of QR code data source
        byte[] d = srcValue.getBytes();  
        int dataLength = d.length;  
        int imageWidth = 113; // image size must >= QR code size, or else it will 
                              // not be correctly decoded
        int imageHeight = imageWidth;  
        BufferedImage bi = new BufferedImage(imageWidth, imageHeight,  
                BufferedImage.TYPE_INT_RGB);  
        Graphics2D g = bi.createGraphics();  
        g.setBackground(Color.WHITE);  
        g.clearRect(0, 0, imageWidth, imageHeight);  
        g.setColor(Color.BLACK);  
        if (dataLength > 0 && dataLength <= MAX_DATA_LENGTH) {  

            Qrcode qrcode = new Qrcode();  
            //错误修正容量   
            //L水平   7%的字码可被修正  
            //M水平   15%的字码可被修正  
            //Q水平   25%的字码可被修正  
            //H水平   30%的字码可被修正  
            //QR码有容错能力,QR码图形如果有破损,仍然可以被机器读取内容,最高可以到7%~30%面积破损仍可被读取。  
            
            qrcode.setQrcodeErrorCorrect('M'); // L, Q, H, by default
            
            qrcode.setQrcodeEncodeMode('B'); // A, N, Ĭ��  
            qrcode.setQrcodeVersion(5); // 37 bytes, (37-1)*3+2+3-1+1 = 113
            boolean[][] b = qrcode.calQrcode(d);  
            int qrcodeDataLen = b.length;  
            for (int i = 0; i < qrcodeDataLen; i++) {  
                for (int j = 0; j < qrcodeDataLen; j++) {  
                    if (b[j][i]) {  
                        g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3); 
                        
                    }  
                }  
            }  
            System.out.println("QR code data length" + qrcodeDataLen);  
        } else {  
            System.out.println("Generate QRCode image error! Data size is " + dataLength +", it is lager than 84 bytes.");  
            return false;  
        }  
        g.dispose();  
        bi.flush();  
        /* generate image */  
        File f = new File(qrcodePicfilePath);  
        String suffix = f.getName().substring(f.getName().indexOf(".")+1, f.getName().length());  
        try {  
            ImageIO.write(bi, suffix, f); //"png"  
        } catch (IOException ioe) {  
            System.out.println("Generate QRCode image error!" + ioe.getMessage());  
            return false;  
        }  
  
        return true;  
    }  
      
    /** 
     * Encoding the information to a QRCode, size of the information must be less tah 500 byte. 
     * @param srcValue 
     * @param qrcodePicfilePath 
     * @return 
     */  
    public static boolean encode_500(String srcValue, String qrcodePicfilePath) {  
        int MAX_DATA_LENGTH = max_data_size_large; 
        byte[] d = srcValue.getBytes();  
        int dataLength = d.length;  
        int imageWidth = 269; 
        int imageHeight = imageWidth;  
        BufferedImage bi = new BufferedImage(imageWidth, imageHeight,  
                BufferedImage.TYPE_INT_RGB);  
        Graphics2D g = bi.createGraphics();  
        g.setBackground(Color.WHITE);  
        g.clearRect(0, 0, imageWidth, imageHeight);  
        g.setColor(Color.BLACK);  
        if (dataLength > 0 && dataLength <= MAX_DATA_LENGTH) {  
            /* ��ɶ�ά�� */  
            Qrcode qrcode = new Qrcode();  
            qrcode.setQrcodeErrorCorrect('M'); 
            qrcode.setQrcodeEncodeMode('B'); 
            qrcode.setQrcodeVersion(18); // 0<= version <=40; 89�ֽ�,  
                                            // (89-1)*3+2+3-1+1 = 269  
            boolean[][] b = qrcode.calQrcode(d);  
            int qrcodeDataLen = b.length;  
            for (int i = 0; i < qrcodeDataLen; i++) {  
                for (int j = 0; j < qrcodeDataLen; j++) {  
                    if (b[j][i]) {  
                        g.fillRect(j * 3 + 2, i * 3 + 2, 3, 3); 
                    }  
                }  
            }  
            System.out.println("QR code size" + qrcodeDataLen);  
        } else {  
            return false;  
        }  
        g.dispose();  
        bi.flush();  
        /* generate image */  
        File f = new File(qrcodePicfilePath);  
        String suffix = f.getName().substring(f.getName().indexOf(".")+1, f.getName().length());  
        System.out.println(suffix);  
        try {  
            ImageIO.write(bi, suffix, f); //"png"  
        } catch (IOException ioe) {  
            System.out.println("Generate QRCode image error!" + ioe.getMessage());  
            return false;  
        }  
  
        return true;  
    }  
      
    public static void main(String[] args) throws Exception {  
        System.out.println("trying to encode QRCode...");
        String data = "亲,这是用来生成二维码的测试字符串。。。";  
        System.out.println("total number of source string: " + data.getBytes().length);  
        GucasQRCodeEncoder.encode(data, "c:\\temp\\A1.JPG");  
        System.out.println("encoded string: " + GucasQRCodeDecoder.decode("c:\\temp\\A1.JPG"));  
    }  
}  

package qrCode;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import net.glxn.qrgen.QRCode;
import net.glxn.qrgen.image.ImageType;

public class Main {
    public static void main(String[] args) {
        ByteArrayOutputStream out = QRCode.from("Hello World").to(ImageType.PNG).stream();

        try {
            FileOutputStream fout = new FileOutputStream(new File(
                    "C:\\temp\\QR_Code.JPG"));

            fout.write(out.toByteArray());

            fout.flush();
            fout.close();

        } catch (FileNotFoundException e) {
            // Do Logging
        } catch (IOException e) {
            // Do Logging
        }
    }
    /* 除了使用QRGen的API来生成数据流,我们还可以使用下面的API来创建QR码:
// get QR file from text using defaults
File file = QRCode.from("Hello World").file();
// get QR stream from text using defaults
ByteArrayOutputStream stream = QRCode.from("Hello World").stream();

// override the image type to be JPG
QRCode.from("Hello World").to(ImageType.JPG).file();
QRCode.from("Hello World").to(ImageType.JPG).stream();

// override image size to be 250x250
QRCode.from("Hello World").withSize(250, 250).file();
QRCode.from("Hello World").withSize(250, 250).stream();

// override size and image type
QRCode.from("Hello World").to(ImageType.GIF).withSize(250, 250).file();
QRCode.from("Hello World").to(ImageType.GIF).withSize(250, 250).stream();


在Java中生成网站链接(URL)的QR码

QR 码最常见的应用便是为网站中一个特定的网页或下载页带来流量。因此,QR码常常会编码URL或网站地址,用户可以通过手机摄像头扫描,并在其浏览器中打开。URL可以直接编码在QR码中。在上面的的Hello World示例中,只需把“Hello World”这个字符串替换为需要编码的URL。下面是代码片段:
ByteArrayOutputStream out = QRCode.from("http://viralpatel.net").to(ImageType.PNG).stream();

*/
    
}

你可能感兴趣的:(Java,开源)