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");
}
}
分享到:
相关推荐
Java二维码生成工具是一种基于Java编程语言的实用程序,它能够帮助开发者创建二维码图像,以便在各种应用场景中使用,如信息传递、网址链接、名片交换等。二维码作为一种高效的数据编码方式,已经广泛应用于现代生活...
本主题聚焦于"JS和Java二维码生成",我们将会深入探讨这两种编程语言如何实现二维码的创建。 首先,让我们从JavaScript(JS)开始。JS是一种轻量级的解释型编程语言,通常用于网页的客户端脚本,它可以让网页具有...
Java二维码生成技术是一种在软件开发中常用的功能,它允许我们将数据编码成二维图像,以便于快速扫描和读取。Qrcode(二维码)是日本Denso Wave公司发明的一种矩阵式条形码,相比于传统的条形码,它能存储更多的数据...
Java二维码生成器是一种工具,它允许开发者通过编程方式在Java应用程序中创建二维码图像。二维码,全称为Quick Response Code,是一种二维条形码,能够存储大量的数据,如文本、URL、联系信息等,并且可以通过智能...
Java 二维码生成是一个常见的编程需求,特别是在移动互联网和物联网领域,二维码被广泛用于信息传递、链接跳转等场景。这个“java 二维码生成带码包含架包”应该是一个包含完整功能的Java库,用于创建二维码图像,...
Java二维码生成Demo是一种在Java编程环境中创建二维码图像的示例代码。二维码,全称为“Quick Response Code”,是一种二维条码,能存储大量的信息,如文本、URL、联系人信息等,广泛应用于移动支付、产品追溯等领域...
QRCodeUtils使用文档详见博客https://blog.csdn.net/qq_24091555/article/details/81263472
Java二维码生成技术是一种在软件开发中广泛使用的编码方式,它能够将大量的信息,如文本、网址、联系人信息等,编码成一个二维图形——二维码,方便用户通过手机或其他设备快速扫描读取。在这个主题中,我们主要关注...
总的来说,“Java二维码生成demo”是一个有价值的教育资源,它涵盖了Java二维码生成、自定义元素添加以及与微信通知集成的关键技术,对于想要在自己的项目中应用二维码功能的开发者来说,是一个很好的学习起点。...
Java二维码生成技术是一种在Java编程环境中创建二维码图像的方法,它允许开发者将文本、链接或者其他数据编码成二维图形,便于手机扫描。在这个“java二维码生成Demo”中,我们可能看到一个简单的示例,演示如何利用...
以下是一个简单的Java二维码生成示例: 1. 引入ZXing依赖:如果你使用的是Maven项目,可以在pom.xml中添加以下依赖: ```xml <groupId>com.google.zxing</groupId> <artifactId>core <version>3.4.1 ...
Java QRCode二维码生成与识别是Java编程领域中的一个重要技术,主要应用于数据编码和快速信息交换。QRCode(Quick Response Code)是一种二维条码,能够存储大量的文本信息,包括字母、数字、汉字等,并且可以被各种...
Java 二维码生成与解析是Java开发中常见的功能需求,尤其在移动互联网时代,二维码被广泛应用于数据交换、链接跳转、支付凭证等场景。本文将详细介绍如何使用Google的ZXing库来实现Java环境下的二维码生成与解析。 ...
Java二维码生成技术是一种在软件开发中常见的数据编码方式,它将信息编码成黑白相间的图形,使得机器可以快速读取和人类也能识别。本压缩包"Java二维码生成.rar"提供了实现这一功能所需的资源,包括一个jar包...
Java二维码生成工具是一种基于Java编程语言的实用工具,主要用于创建二维码图像。这个工具包提供了两种不同的生成方式:带有边框的二维码和无边框的二维码。这两种方式在视觉效果上有所区别,用户可以根据应用场景...
Java二维码生成代码主要涉及到的是Java编程语言与二维码技术的结合,用于创建可被智能手机扫描的二维码,例如用于下载APK应用程序。在Java中实现二维码生成,通常会借助于开源库,如ZXing(Zebra Crossing)。 ...
以下是一些关于Java二维码生成与解析的关键知识点: 1. **依赖库**: - `QRCode.jar`:这是用于生成和解码二维码的库,它可能包含了`jp.sourceforge.qrcode`和`com.swetake.util.Qrcode`这两个包,这两个包提供了...
本文将深入探讨如何使用Java实现二维码生成,同时结合Logo的嵌入,为二维码增添个性化元素。 首先,我们要知道二维码(Quick Response code)是一种二维条形码,能够存储大量的数据,如文本、URL、联系信息等。在...