一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java生成彩色附logo二維碼

java生成彩色附logo二維碼

2020-04-17 11:57lijiao JAVA教程

這篇文章主要為大家介紹了java生成帶logo的多彩二維碼,比一般二維碼顏色鮮艷,美觀,如何生成二維碼,下面小編為大家分享實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下

java生成二維碼有很多開(kāi)發(fā)的jar包如zxing是谷歌開(kāi)發(fā)的,這里的話我使用zxing的開(kāi)發(fā)包來(lái)實(shí)現(xiàn)的。我們?cè)诤芏囗?xiàng)目中需要?jiǎng)討B(tài)生成二維碼,來(lái)提供給用戶(hù),這樣讓更多人能夠很好的通過(guò)二維碼來(lái)體驗(yàn)自己的應(yīng)用。

下面貼出代碼,已經(jīng)測(cè)試通過(guò),大家可以直接復(fù)制代碼使用:

最后實(shí)現(xiàn)結(jié)果:

java生成彩色附logo二維碼

java生成二維碼

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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 MatrixToImageWriter {
 private static final int IMAGE_WIDTH = 100;
 private static final int IMAGE_HEIGHT = 100;
 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 encode(String content, int width, int height,
   String srcImagePath, String destImagePath) {
  try {
   ImageIO.write(genBarcode(content, width, height, srcImagePath),
     "jpg", new File(destImagePath));
  } catch (IOException e) {
   e.printStackTrace();
  } catch (WriterException e) {
   e.printStackTrace();
  }
 }
 
 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");
  hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  // 生成二維碼
  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++) {
    // 左上角顏色,根據(jù)自己需要調(diào)整顏色范圍和顏色 
    if (x > 0 && x < 170 && y > 0 && y < 170) {
     Color color = new Color(231, 144, 56);
     int colorInt = color.getRGB();
     pixels[y * width + x] = matrix.get(x, y) ? colorInt
       : 16777215;
    }
    // 讀取圖片
    else 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 > halfW - 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 {
     // 二維碼顏色
     int num1 = (int) (50 - (50.0 - 13.0) / matrix.getHeight()
       * (y + 1));
     int num2 = (int) (165 - (165.0 - 72.0) / matrix.getHeight()
       * (y + 1));
     int num3 = (int) (162 - (162.0 - 107.0)
       / matrix.getHeight() * (y + 1));
     Color color = new Color(num1, num2, num3);
     int colorInt = color.getRGB();
     // 此處可以修改二維碼的顏色,可以分別制定二維碼和背景的顏色;
     pixels[y * width + x] = matrix.get(x, y) ? colorInt
       : 16777215;
     // 0x000000:0xffffff 
    }
   }
  }
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  image.getRaster().setDataElements(0, 0, width, height, pixels);
  return image;
 }
 
 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.white);
   graphic.fillRect(0, 0, 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);
   else
    graphic.drawImage(destImage,
      (width - destImage.getWidth(null)) / 2, 0,
      destImage.getWidth(null), destImage.getHeight(null),
      Color.white, null);
   graphic.dispose();
   destImage = image;
  }
  return (BufferedImage) destImage;
 }
 
 public static void main(String[] args) throws UnsupportedEncodingException {
  // 依次為內(nèi)容(不支持中文),寬,長(zhǎng),中間圖標(biāo)路徑,儲(chǔ)存路徑
  MatrixToImageWriter.encode("http://www.baidu.com/", 512, 512,
    "D:\\logo.png", "D:\\2013-01.jpg");
 
 }
}

以上就是本文的全部?jī)?nèi)容,幫助大家設(shè)計(jì)屬于自己的二維碼。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99热精品在线观看 | 国产精彩对白综合视频 | 欧美vpswindows动物 | 免费岛国片 | 精品成人一区二区 | 校花被吃奶还摸下面 | 69日本xxⅹxxxxx19 | 亚洲一区二区精品推荐 | 草莓丝瓜芭乐樱桃榴莲色多黄 | fc2免费人成为视频 eeuss18影院www国产 | 亚洲国产成人精品无码区APP | 国产精品成人在线播放 | 色综合久久最新中文字幕 | 91动漫在线观看 | 极品丝袜乱系列在线阅读 | 日韩精品一区二区三区毛片 | 国产v在线在线观看羞羞答答 | 日本网 | 视频在线精品 | 四虎永久在线精品波多野结衣 | 亚洲成人一区 | 黄网在线观看免费网站台湾swag | 高h短篇辣肉各种姿势bl | 2022日韩理论片在线观看 | 色婷婷婷婷 | 日本一区二区视频在线观看 | 亚洲毛片基地4455ww | 沉沦艳妇杨幂肉体小说 | 欧美香蕉 | 小便japanesewctv | 午夜私人影院在线观看 视频 | 免费国产在线视频 | 91混血大战上海双胞胎 | 色综合天天五月色 | 手机看片福利 | www视频在线免费观看 | 99久久国产综合精麻豆 | 国产精品久久久久久搜索 | 四虎影视免费 | 亚洲欧美日韩中文字幕网址 | 97热久久免费频精品99国产成人 |