- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用Zxing实现二维码生成器内嵌图片由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
使用Zxing实现二维码生成器内嵌图片,具有一定的参考价值,具体如下:
基本思路是先使用zxing生成的二维码图片,然后读取图片,在其中插入图标,然后整个输出图片.
最近的项目中需要生成二维码,找了几个例子综合下,做出了最后的效果,二维码可以生成图片格式(jpg等)或者在web页面上显示,此片文章仅作记录,雷同之处多多,包涵。。。.
注:需要Zxing包装的工具类,大概的流程是读取内嵌的图片,将内容转化成二维码,将图片内嵌到二维码中,出图.
下面是完整代码:
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
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"
;
//二维码的内容
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 "
);
}
/**
//将上面的代码换成此处,使用流读入到页面即可
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"
);
//内容编码
hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//错误等级
hint.put(EncodeHintType.MARGIN,
1
);
//设置二维码外边框的空白区域的宽度
// 生成二维码
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.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;
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于使用Zxing实现二维码生成器内嵌图片的文章就讲到这里了,如果你想了解更多关于使用Zxing实现二维码生成器内嵌图片的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我使用以下代码和嵌套生成器迭代文本文档并使用 get_train_minibatch() 返回训练示例。我想保留( pickle )生成器,这样我就可以回到文本文档中的相同位置。但是,您不能 pick
在本教程中,您将借助示例了解 JavaScript 生成器。在 JavaScript 中,生成器提供了一种使用函数和迭代器的新方法。 使用生成器, 您可以从函数内部的任何位置停止执行函数 并从
LESS is very cool .我一直想知道是否有任何好的 html 生成器可以让我更轻松地编写表单或做其他事情。除了 html,是否有一些类似的东西? 最佳答案 已尝试 Haml ? 从它的网
前言 如果是做python或者其他语言的小伙伴,对于生成器应该不陌生。但很多php开发者或许都不知道生成器这个功能,可能是因为生成器是php 5.5.0才引入的功能,也可以是生成器作用不是很明显。
我正在尝试编写一个使用生成器语法生成日期时间列表的函数: let dateRange = let endDate = System.DateTime.Parse("6/1/2010")
我遇到了一些看起来像的代码: [func(val) for val in iterable] 有一个可迭代对象(在我的例子中是一个生成器),用户想要为其副作用调用每个值的函数(例如 func 可以只是
Delphi 有内置的东西来生成 UUID 吗? 最佳答案 program Guid; {$APPTYPE CONSOLE} uses SysUtils; var Uid: TGuid; Result
我正在深入研究 javascript 生成器,但我真的很困惑。 我使用 node@0.11.x 运行此示例: function find() { process.nextTick(functi
有人知道一些关于如何为 hibernate 创建自定义 ID 生成器的好教程吗? 最佳答案 在 Google 上粗略搜索“hibernate 自定义 id 生成器教程”发现了以下可能性。我排除了那些看
我正在关注 Python 大师 David Beazley 的幻灯片。它指出“生成器也用于并发。这是一个示例: from collections import deque def countdown(
我有一个生成事件的生成器,我想用可以从 API 获取的附加元数据来丰富它。 某些事件具有与其链接的对象 ID,而其他事件则具有对象的哈希值,但不能同时具有两者。我无法根据哈希获取对象 id,我只能执行
假设我有一个自定义类: public class CustomClass { private String name; private String data; public
我正在考虑实现一个函数来在 SQL 请求中“构建”WHERE 子句,如下所示: "SELECT * FROM table $where" 使用如下所示的循环构建 $where: $arr=array(
我正在寻找执行此操作的标准函数: def Forever(v): while True: yield v 这看起来太琐碎了,我不敢相信没有标准版本。 就此而言,有人知道指向所有标准生成器函
我知道这个网站上有几个非常相似的相关问题,但是在看了这部剧之后,我相信这个问题本身就是独一无二的。如果有人能找到并提供证据证明我的问题完全被骗了,我会自己撤回它(所以请不要否决这个!)。 我是 Jav
void __fastcall TForm1::Button1Click(TObject *Sender) { int size = MemoEnter->GetTextLen() + 1;
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我试图在我的生成器的以下两个定义之间做出决定。哪个更好?哪个“更像 python ”?无论如何,有没有办法减轻每一个的缺点? def myGenerator1(howMany): result
我有一个 Python 生成器 lexg,它在每次迭代时生成一个列表。该代码似乎在传统的 for 循环意义上工作,即 for i in lexg(2,2): print(i) 产生: [2, 0] [
我希望这不会超出 Python 生成器的能力,但我想构建一个这样,每次调用该函数时,它都会返回下一分钟直到结束时间。 因此该函数读取开始时间和结束时间,并以分钟为单位返回时间,直到涵盖其间的所有时间。
我是一名优秀的程序员,十分优秀!