欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Zxing實(shí)現(xiàn)二維碼生成器內(nèi)嵌圖片

 更新時(shí)間:2016年10月27日 15:06:14   作者:lcx46  
二維碼在現(xiàn)實(shí)中的應(yīng)用已經(jīng)很廣泛了,本文介紹了使用Zxing實(shí)現(xiàn)二維碼生成器內(nèi)嵌圖片,有需要的可以了解一下。

使用Zxing實(shí)現(xiàn)二維碼生成器內(nèi)嵌圖片,具有一定的參考價(jià)值,具體如下:

基本思路是先使用zxing生成的二維碼圖片,然后讀取圖片,在其中插入圖標(biāo),然后整個(gè)輸出圖片。

最近的項(xiàng)目中需要生成二維碼,找了幾個(gè)例子綜合下,做出了最后的效果,二維碼可以生成圖片格式(jpg等)或者在web頁(yè)面上顯示,此片文章僅作記錄,雷同之處多多,包涵。。。。

注:需要Zxing包裝的工具類,大概的流程是讀取內(nèi)嵌的圖片,將內(nèi)容轉(zhuǎn)化成二維碼,將圖片內(nèi)嵌到二維碼中,出圖。

下面是完整代碼:

import Java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


import javax.imageio.ImageIO;


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;


public class Zxing {


private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
// 圖片寬度的一般 
 private static final int IMAGE_WIDTH = 80; 
 private static final int IMAGE_HEIGHT = 80; 
 private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2; 
 private static final int FRAME_WIDTH = 2; 
 
 // 二維碼寫碼器 
 private static MultiFormatWriter mutiWriter = new MultiFormatWriter(); 
public static void main(String[] args) {
try {
//BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);
String content="13400000000";//二維碼的內(nèi)容
BufferedImage image = genBarcode(content, 400, 400, "F:\\amazed.png");
  if (!ImageIO.write(image, "jpg", new File("F:\\2122.jpg"))) {
   throw new IOException("Could not write an image of format ");
  }

          /**

           //將上面的代碼換成此處,使用流讀入到頁(yè)面即可

OutputStream os = response.getOutputStream();

 if (!ImageIO.write(image, "jpg",os)) {

       throw new IOException("Could not write an image of format ");

      }

          **/
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
private static BufferedImage genBarcode(String content, int width, 
     int height, String srcImagePath) throws WriterException, 
     IOException { 
   // 讀取源圖像 
   BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH, 
       IMAGE_HEIGHT, true); 
   int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT]; 
   for (int i = 0; i < scaleImage.getWidth(); i++) { 
     for (int j = 0; j < scaleImage.getHeight(); j++) { 
       srcPixels[i][j] = scaleImage.getRGB(i, j); 
     } 
   } 
 
   Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>(); 
   hint.put(EncodeHintType.CHARACTER_SET, "utf-8"); //內(nèi)容編碼
   hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//錯(cuò)誤等級(jí)
   hint.put(EncodeHintType.MARGIN, 1); //設(shè)置二維碼外邊框的空白區(qū)域的寬度
   // 生成二維碼 
   BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE, 
       width, height, hint); 
 
   // 二維矩陣轉(zhuǎn)為一維像素?cái)?shù)組 
   int halfW = matrix.getWidth() / 2; 
   int halfH = matrix.getHeight() / 2; 
   int[] pixels = new int[width * height]; 
 
   for (int y = 0; y < matrix.getHeight(); y++) { 
     for (int x = 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]; 
       }  
       // 在圖片四周形成邊框 
       else if ((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; 
       } 
     } 
   } 
 
   BufferedImage image = new BufferedImage(width, height, 
       BufferedImage.TYPE_INT_RGB); 
   image.getRaster().setDataElements(0, 0, width, height, pixels); 
 
   return image; 
 } 
 
 /** 
  * 把傳入的原始圖像按高度和寬度進(jìn)行縮放,生成符合要求的圖標(biāo) 
  * 
  * @param srcImageFile 
  *      源文件地址 
  * @param height 
  *      目標(biāo)高度 
  * @param width 
  *      目標(biāo)寬度 
  * @param hasFiller 
  *      比例不對(duì)時(shí)是否需要補(bǔ)白:true為補(bǔ)白; false為不補(bǔ)白; 
  * @throws IOException 
  */ 
 private static BufferedImage scale(String srcImageFile, int height, 
     int width, boolean hasFiller) throws IOException { 
   double ratio = 0.0; // 縮放比例 
   File file = new File(srcImageFile); 
   BufferedImage srcImage = ImageIO.read(file); 
   Image destImage = srcImage.getScaledInstance(width, height, 
       BufferedImage.SCALE_SMOOTH); 
   // 計(jì)算比例 
   if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) { 
     if (srcImage.getHeight() > srcImage.getWidth()) { 
       ratio = (new Integer(height)).doubleValue() 
           / srcImage.getHeight(); 
     } else { 
       ratio = (new Integer(width)).doubleValue() 
           / srcImage.getWidth(); 
     } 
     AffineTransformOp op = new AffineTransformOp( 
         AffineTransform.getScaleInstance(ratio, ratio), null); 
     destImage = op.filter(srcImage, null); 
   } 
   if (hasFiller) {// 補(bǔ)白 
     BufferedImage image = new BufferedImage(width, height, 
         BufferedImage.TYPE_INT_RGB); 
     Graphics2D graphic = 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); 
       Shape shape = new RoundRectangle2D.Float(0, (height - destImage.getHeight(null)) / 2, width, width, 20, 20);
       graphic.setStroke(new BasicStroke(5f));
       graphic.draw(shape);
     }
     else {
       graphic.drawImage(destImage, 
           (width - destImage.getWidth(null)) / 2, 0, 
           destImage.getWidth(null), destImage.getHeight(null), 
           Color.white, null);
       Shape shape = new RoundRectangle2D.Float((width - destImage.getWidth(null)) / 2, 0, width, width, 20, 20);
       graphic.setStroke(new BasicStroke(5f));
       graphic.draw(shape);
     }
     graphic.dispose(); 
     destImage = image; 
     
   } 
   return (BufferedImage) destImage; 
 } 
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于mybatis進(jìn)行批量更新兩種方法

    基于mybatis進(jìn)行批量更新兩種方法

    這篇文章主要給大家介紹了關(guān)于如何基于mybatis進(jìn)行批量更新的兩種方法,批量更新的使用,mybatis中批量更新有很多種方法,可以把數(shù)據(jù)一條條更新,也可以傳入一個(gè)數(shù)據(jù)集一次性更新,需要的朋友可以參考下
    2023-08-08
  • 如何在Spring boot加入shiro支持

    如何在Spring boot加入shiro支持

    這篇文章主要介紹了如何在Spring boot加入shiro支持,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • windows java.exe內(nèi)存暴漲解決、idea跑java\ tomcat內(nèi)存無(wú)限增長(zhǎng)

    windows java.exe內(nèi)存暴漲解決、idea跑java\ tomcat內(nèi)存無(wú)限增長(zhǎng)

    這篇文章主要介紹了windows java.exe內(nèi)存暴漲解決、idea跑 java\ tomcat內(nèi)存無(wú)限增長(zhǎng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Java實(shí)現(xiàn)視頻初步壓縮和解壓的代碼示例

    Java實(shí)現(xiàn)視頻初步壓縮和解壓的代碼示例

    從攝像頭讀取每一幀的圖片,用一些簡(jiǎn)單的方法將多張圖片信息壓縮到一份文件中(自定義的視頻文件),自定義解碼器讀取視頻文件,并將每幀圖片展示成視頻,本文主要介紹了Java實(shí)現(xiàn)視頻初步壓縮和解壓,需要的朋友可以參考下
    2023-10-10
  • JDK源碼之Vector與HashSet解析

    JDK源碼之Vector與HashSet解析

    HashSet、HashMap、ArrayList、LinkedList、Vector這幾個(gè)在Java編程中經(jīng)常用到,他們之間有很多聯(lián)系,有很多相通的地方,我們這次先了解一下Vector與HashSet
    2021-06-06
  • Java 模擬cookie登陸簡(jiǎn)單操作示例

    Java 模擬cookie登陸簡(jiǎn)單操作示例

    這篇文章主要介紹了Java 模擬cookie登陸簡(jiǎn)單操作,結(jié)合實(shí)例形式分析了Java 模擬cookie登陸的相關(guān)原理與基本實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-03-03
  • 解決jhipster修改jdl生成的實(shí)體類報(bào)錯(cuò):liquibase.exception.ValidationFailedException: Validation Failed

    解決jhipster修改jdl生成的實(shí)體類報(bào)錯(cuò):liquibase.exception.ValidationFailed

    這篇文章主要介紹了解決jhipster修改jdl生成的實(shí)體類報(bào)錯(cuò):liquibase.exception.ValidationFailedException: Validation Failed問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java設(shè)計(jì)模式之裝飾模式詳解

    Java設(shè)計(jì)模式之裝飾模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之裝飾模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 詳解Spring基于xml的兩種依賴注入方式

    詳解Spring基于xml的兩種依賴注入方式

    這篇文章主要介紹了詳解Spring基于xml的兩種依賴注入方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java關(guān)于MyBatis緩存詳解

    Java關(guān)于MyBatis緩存詳解

    緩存的重要性是不言而喻的,使用緩存,我們可以避免頻繁的與數(shù)據(jù)庫(kù)進(jìn)行交互,尤其是在查詢?cè)蕉唷⒕彺婷新试礁叩那闆r下,使用緩存對(duì)性能的提高更明顯。本文將給大家詳細(xì)的介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值
    2021-09-09

最新評(píng)論