Googleの2次元コードのGoogle zxing

まず、我々はパッケージグーグル-zxingコア-3.2.1.jarを必要とする、グーグル-zxing-のJava SE-3.2.1.jarカスタムバージョンを別のバージョンでサポートされていません。

効果

  

手順:logo.pngズーム、2次元コードを描き、生成された画像

ツール:

  

パッケージcom.demo.web.common。

インポートをjava.awt.Color;
輸入java.awt.Graphics2D;
輸入はjava.awt.Image;
輸入java.awt.geom.AffineTransformの。
輸入java.awt.image.AffineTransformOp。
輸入java.awt.image.BufferedImage。
インポートのjava.io.File;
インポートにjava.io.IOException;
輸入java.util.HashMapを;
輸入java.util.Map; 

輸入javax.imageio.ImageIO; 

輸入com.google.zxing.BarcodeFormat。
輸入com.google.zxing.EncodeHintType。
輸入com.google.zxing.MultiFormatWriter。
輸入com.google.zxing.WriterException。
輸入com.google.zxing.common.BitMatrix。
輸入com.google.zxing.qrcode.decoder.ErrorCorrectionLevel。

パブリック クラスQRcodeUtil {
     // 图片宽度的一般
    プライベート 静的 最終 int型 = 50 IMAGE_WIDTH プライベート 静的 最終 int型 = 50 IMAGE_HEIGHT プライベート 静的 最終 int型 IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2 ;
    プライベート 静的 最終 int型 = 2 FRAME_WIDTH 

    //二维码写码器
    プライベート 静的 MultiFormatWriter mutiWriter = 新しいMultiFormatWriter(); 

    公共の 静的な 無効エンコード(文字列の内容、int型の幅、int型の高さ、文字列srcImagePath、文字列destImagePath){
         しようと{ 
            ImageIO.write(genBarcode(コンテンツ、幅、高さ、srcImagePath)、 "PNG"、新しいファイル(destImagePath)); 
        } キャッチ(IOExceptionを電子){ 
            e.printStackTrace(); 
        } キャッチ(WriterException電子){ 
            e.printStackTrace(); 
        } 
    }

    プライベート 静的たBufferedImage genBarcode(文字列コンテンツ、int型の幅は、int型の高さ、文字列srcImagePath)が
             スローWriterExceptionは、IOException {
         // 读取源图像 
        たBufferedImage scaleImage =スケール(srcImagePath、IMAGE_WIDTH、IMAGE_HEIGHT、真の);
        INT [] [] srcPixels = 新しい int型[IMAGE_WIDTH] [IMAGE_HEIGHT]。
        以下のためにint型 i = 0; iは++; iはscaleImage.getWidth()< ){
             ためのint型 J = 0; J <scaleImage.getHeight(); J ++ ){
                srcPixelsを[I] [J] =scaleImage.getRGB(I、J); 
            } 
        } 

        // コード、二次元コードの誤り訂正のレベル設定 
        地図<EncodeHintType、OBJECT> =ヒント新しい新規のHashMap <EncodeHintType、オブジェクト> ;()
        hint.put(EncodeHintType.CHARACTER_SET、「UTFを-8 " ); 
        hint.put(EncodeHintType.ERROR_CORRECTION、ErrorCorrectionLevel.H); 
        // 生成する二次元コード 
        BitMatrixマトリックス= mutiWriter.encode(コンテンツ、BarcodeFormat.QR_CODE、幅、高さ、ヒント); 

        // 2次元マトリクス転置ピクセルの一次元アレイ
        INT halfW matrix.getWidth =()/ 2 ;
         INT halfH matrix.getHeight =()/ 2 ;
        int型 [] =画素を新しい int型 [幅* 高さ]。

        INT Y = 0; Y <matrix.getHeight(); Y ++ ){
             ためint型のx = 0; X <matrix.getWidth(); X ++ ){
                 // 读取图片
                場合(X> halfW - IMAGE_HALF_WIDTH && X <halfW + IMAGE_HALF_WIDTH && Y> halfH - IMAGE_HALF_WIDTH
                         && Y <halfH + IMAGE_HALF_WIDTH){ 
                    画素[Yの *幅+ X] = srcPixels [X - halfW + IMAGE_HALF_WIDTH] [Y - halfH + IMAGE_HALF_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)
                         ||(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)){ 
                    画素[Y幅+ X *] = 0xFFFFFFF ; 
                } {
                     // それぞれここで色の二次元コードを変更することができ、二次元コードを開発することができ、背景色、; 
                    画素[X + Y *幅] = matrix.get(X、Y ?)0xFF000000:0xFFFFFFF 0xfffffff 
                } 
            } 
        } 

        バッファ画像イメージ = 新しい新規のBufferedImage(幅、高さ、BufferedImage.TYPE_INT_RGB)
        。Image.getRaster()setDataElements(に 0、0 、幅、高さ、ピクセル); 

        戻りイメージ; 
    } 

    / ** 
     *着信生生成されたアイコンの要件を満たすために、高さと幅を縮小して画像
     * 
     * @paramのsrcImageFile元アドレス
     * @paramの高さが一定の高さ
     * @paramの幅対象幅
     * @paramのhasFiller比は、パディング必要がない場合:パディングのための真の;としてfalseにしますパディング; 
     * @throwsませんIOException
      * / 
    プライベート 静的バッファ画像スケール(文字列srcImageFile、int型の高さ、int型の幅、ブールhasFiller)が
             スローにIOException {
         ダブル比= 0.0。// 缩放比例 
        ファイルファイル= 新しいファイル(srcImageFile)。
        BufferedImageのsrcImage = ImageIO.read(ファイル); 
        画像destImage = srcImage.getScaledInstance(幅、高さ、BufferedImage.SCALE_SMOOTH)。
        // 计算比例
        場合((srcImage.getHeight()>高さ)||(srcImage.getWidth()>幅)){
            もし(srcImage.getHeight()> srcImage.getWidth()){  =(新しい整数(高さ))のdoubleValue()/。srcImage.getHeight(); 
            } {  =(新しい整数(幅))のdoubleValue()/。srcImage.getWidth(); 
            } 
            AffineTransformOp OP = 新しい AffineTransformOp(AffineTransform.getScaleInstance(比率、割合)、NULL ); 
            destImage = op.filter(srcImage、NULL ); 
        } 
        であれば(hasFiller){ // 补白 
            バッファ画像イメージ= 新しいBufferedImageの(幅、高さ、BufferedImage.TYPE_INT_RGB)。
            Graphics2Dのグラフィック =のimage.createGraphics(); 
            graphic.setColor(Color.white)。
            graphic.fillRect( 0、0 、幅、高さ)。
            もし(幅== destImage.getWidth(ヌル))
                graphic.drawImage(destImage、 0、(高- destImage.getHeight(ヌル))/ 2、destImage.getWidth(NULL )、
                        destImage.getHeight(NULL)、Color.white 、NULL );
            
                graphic.drawImage(destImage、(幅 - destImage.getWidth(ヌル))/ 2、0、destImage.getWidth(NULL )、
                        destImage.getHeight(NULL)、Color.white、NULL ); 
            graphic.dispose(); 
            destImage = 画像。
        } 
        リターン(BufferedImageの)destImage。
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){
         // 将1.pngの作为ロゴ放在2.png中间生成扫码图片2.png变成二维码 
        QRcodeUtil.encode(「http://www.baidu .COM」、300、300、 "D:/1.png"、 "D:/2.png" )。
        System.out.println( "成功!" ); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/demon7715/p/10984160.html