まず、我々はパッケージグーグル-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( "成功!" ); } }