`
吟恋错
  • 浏览: 15546 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JAVA二维码生成

阅读更多


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.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; 
import com.sdy.huge.utils.file.AccessoryConfig;
 
/**
* @author ygd

*/ 
public class CodeFactory { 
    // 图片宽度的一般 
    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 encode(String content, int width, int height, 
            String srcImagePath, String destImagePath) { 
        try { 
        File f = new File(AccessoryConfig.path_absolute+AccessoryConfig.mem_ercod);
     //不存在就創建
     if(!f.exists()){
             f.mkdirs();
             }
            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 > 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; 
    } 
 
    /**
     * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标
     * 
     * @param srcImageFile
     *            源文件地址
     * @param height
     *            目标高度
     * @param width
     *            目标宽度
     * @param hasFiller
     *            比例不对时是否需要补白:true为补白; false为不补白;
     * @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); 
        // 计算比例 
        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) { 
    CodeFactory 
                .encode("http://www.baidu.com", 
                        300, 300, "F:\\123.png", "F:\\456.jpg"); 
    } 
0
7
分享到:
评论

相关推荐

    Java二维码生成工具

    Java二维码生成工具是一种基于Java编程语言的实用程序,它能够帮助开发者创建二维码图像,以便在各种应用场景中使用,如信息传递、网址链接、名片交换等。二维码作为一种高效的数据编码方式,已经广泛应用于现代生活...

    JS 和 java二维码生成

    本主题聚焦于"JS和Java二维码生成",我们将会深入探讨这两种编程语言如何实现二维码的创建。 首先,让我们从JavaScript(JS)开始。JS是一种轻量级的解释型编程语言,通常用于网页的客户端脚本,它可以让网页具有...

    java二维码生成和添加中间图片

    Java二维码生成技术是一种在软件开发中常用的功能,它允许我们将数据编码成二维图像,以便于快速扫描和读取。Qrcode(二维码)是日本Denso Wave公司发明的一种矩阵式条形码,相比于传统的条形码,它能存储更多的数据...

    java二维码生成器

    Java二维码生成器是一种工具,它允许开发者通过编程方式在Java应用程序中创建二维码图像。二维码,全称为Quick Response Code,是一种二维条形码,能够存储大量的数据,如文本、URL、联系信息等,并且可以通过智能...

    java 二维码生成带码包含架包

    Java 二维码生成是一个常见的编程需求,特别是在移动互联网和物联网领域,二维码被广泛用于信息传递、链接跳转等场景。这个“java 二维码生成带码包含架包”应该是一个包含完整功能的Java库,用于创建二维码图像,...

    java二维码生成demo

    Java二维码生成Demo是一种在Java编程环境中创建二维码图像的示例代码。二维码,全称为“Quick Response Code”,是一种二维条码,能存储大量的信息,如文本、URL、联系人信息等,广泛应用于移动支付、产品追溯等领域...

    Java二维码生成/解析工具

    QRCodeUtils使用文档详见博客https://blog.csdn.net/qq_24091555/article/details/81263472

    java二维码生成

    Java二维码生成技术是一种在软件开发中广泛使用的编码方式,它能够将大量的信息,如文本、网址、联系人信息等,编码成一个二维图形——二维码,方便用户通过手机或其他设备快速扫描读取。在这个主题中,我们主要关注...

    Java二维码生成demo

    总的来说,“Java二维码生成demo”是一个有价值的教育资源,它涵盖了Java二维码生成、自定义元素添加以及与微信通知集成的关键技术,对于想要在自己的项目中应用二维码功能的开发者来说,是一个很好的学习起点。...

    java二维码生成Demo

    Java二维码生成技术是一种在Java编程环境中创建二维码图像的方法,它允许开发者将文本、链接或者其他数据编码成二维图形,便于手机扫描。在这个“java二维码生成Demo”中,我们可能看到一个简单的示例,演示如何利用...

    java二维码生成,java二维码生成

    以下是一个简单的Java二维码生成示例: 1. 引入ZXing依赖:如果你使用的是Maven项目,可以在pom.xml中添加以下依赖: ```xml &lt;groupId&gt;com.google.zxing&lt;/groupId&gt; &lt;artifactId&gt;core &lt;version&gt;3.4.1 ...

    Java QRCode二维码生成与识别 开源

    Java QRCode二维码生成与识别是Java编程领域中的一个重要技术,主要应用于数据编码和快速信息交换。QRCode(Quick Response Code)是一种二维条码,能够存储大量的文本信息,包括字母、数字、汉字等,并且可以被各种...

    Java 二维码生成、解析

    Java 二维码生成与解析是Java开发中常见的功能需求,尤其在移动互联网时代,二维码被广泛应用于数据交换、链接跳转、支付凭证等场景。本文将详细介绍如何使用Google的ZXing库来实现Java环境下的二维码生成与解析。 ...

    Java二维码生成.rar

    Java二维码生成技术是一种在软件开发中常见的数据编码方式,它将信息编码成黑白相间的图形,使得机器可以快速读取和人类也能识别。本压缩包"Java二维码生成.rar"提供了实现这一功能所需的资源,包括一个jar包...

    java二维码生成工具.zip

    Java二维码生成工具是一种基于Java编程语言的实用工具,主要用于创建二维码图像。这个工具包提供了两种不同的生成方式:带有边框的二维码和无边框的二维码。这两种方式在视觉效果上有所区别,用户可以根据应用场景...

    java二维码生成代码

    Java二维码生成代码主要涉及到的是Java编程语言与二维码技术的结合,用于创建可被智能手机扫描的二维码,例如用于下载APK应用程序。在Java中实现二维码生成,通常会借助于开源库,如ZXing(Zebra Crossing)。 ...

    java二维码生成与解析代码实现.docx

    以下是一些关于Java二维码生成与解析的关键知识点: 1. **依赖库**: - `QRCode.jar`:这是用于生成和解码二维码的库,它可能包含了`jp.sourceforge.qrcode`和`com.swetake.util.Qrcode`这两个包,这两个包提供了...

    java二维码生成源码带logo...

    本文将深入探讨如何使用Java实现二维码生成,同时结合Logo的嵌入,为二维码增添个性化元素。 首先,我们要知道二维码(Quick Response code)是一种二维条形码,能够存储大量的数据,如文本、URL、联系信息等。在...

Global site tag (gtag.js) - Google Analytics