Home Java javaTutorial Java generates color QR code with logo

Java generates color QR code with logo

Jan 20, 2017 pm 04:08 PM

java生成二维码有很多开发的jar包如zxing是谷歌开发的,这里的话我使用zxing的开发包来实现的。我们在很多项目中需要动态生成二维码,来提供给用户,这样让更多人能够很好的通过二维码来体验自己的应用。

下面贴出代码,已经测试通过,大家可以直接复制代码使用:

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);

    // 二维矩阵转为一维像素数组

    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 > 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);

    // 计算比例 

    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) {

      // 补白

      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 {

    // 依次为内容(不支持中文),宽,长,中间图标路径,储存路径 

    MatrixToImageWriter.encode("http://www.baidu.com/", 512, 512,

        "D:\\logo.png", "D:\\2013-01.jpg");

   

  }

}

Copy after login

以上就是本文的全部内容,帮助大家设计属于自己的二维码。

更多java生成彩色附logo二维码相关文章请关注PHP中文网!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to elegantly obtain entity class variable names to build database query conditions? How to elegantly obtain entity class variable names to build database query conditions? Apr 19, 2025 pm 11:42 PM

When using MyBatis-Plus or other ORM frameworks for database operations, it is often necessary to construct query conditions based on the attribute name of the entity class. If you manually every time...

How to simplify field mapping issues in system docking using MapStruct? How to simplify field mapping issues in system docking using MapStruct? Apr 19, 2025 pm 06:21 PM

Field mapping processing in system docking often encounters a difficult problem when performing system docking: how to effectively map the interface fields of system A...

How does IntelliJ IDEA identify the port number of a Spring Boot project without outputting a log? How does IntelliJ IDEA identify the port number of a Spring Boot project without outputting a log? Apr 19, 2025 pm 11:45 PM

Start Spring using IntelliJIDEAUltimate version...

Is the company's security software causing the application to fail to run? How to troubleshoot and solve it? Is the company's security software causing the application to fail to run? How to troubleshoot and solve it? Apr 19, 2025 pm 04:51 PM

Troubleshooting and solutions to the company's security software that causes some applications to not function properly. Many companies will deploy security software in order to ensure internal network security. ...

How to safely convert Java objects to arrays? How to safely convert Java objects to arrays? Apr 19, 2025 pm 11:33 PM

Conversion of Java Objects and Arrays: In-depth discussion of the risks and correct methods of cast type conversion Many Java beginners will encounter the conversion of an object into an array...

What is the difference between memory leaks in Java programs on ARM and x86 architecture CPUs? What is the difference between memory leaks in Java programs on ARM and x86 architecture CPUs? Apr 19, 2025 pm 11:18 PM

Analysis of memory leak phenomenon of Java programs on different architecture CPUs. This article will discuss a case where a Java program exhibits different memory behaviors on ARM and x86 architecture CPUs...

How to use the Redis cache solution to efficiently realize the requirements of product ranking list? How to use the Redis cache solution to efficiently realize the requirements of product ranking list? Apr 19, 2025 pm 11:36 PM

How does the Redis caching solution realize the requirements of product ranking list? During the development process, we often need to deal with the requirements of rankings, such as displaying a...

See all articles