-
2021-07-24 23:37:44
1、调用二维码生成工具类返回 ByteArrayOutputStream
ByteArrayOutputStream output = new ByteArrayOutputStream(); QRCodeUtils.encode(context,output);//二维码工具类 byte[] arry = output.toByteArray();
2、将字节数组转换成 BASE64 字符串
public static String byteToString(byte[] data){ String dataString=null; try{ dataString = new BASE64Encoder().encode(data); }catch(Exception e){ e.printStackTrace(); } return dataString; }
3、使用json传输图片信息字符串
4、js显示二维码图片
var outputImg = document.getElementById('qrcode'); outputImg.src = 'data:image/png;base64,'+str12;
更多相关内容 -
e语言二维码生产和识别
2018-07-23 12:06:41二维码识别和生成器! 调用了精易模块 希望大家指点指点 -
生成二维码并保存图片以及图片转字节数组、bitmap转字节数组
2019-08-06 11:20:28// <summary> /// 获取链接地址对应的二维码图像 /// /// </summary> public static Bitmap ToQR(String str) { QrEncoder qrEncoder = new Qr...// <summary> /// 获取链接地址对应的二维码图像 /// /// </summary> public static Bitmap ToQR(String str) { QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.M); QrCode qrCode = qrEncoder.Encode(str); GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White); DrawingSize size = render.SizeCalculator.GetSize(qrCode.Matrix.Width); Bitmap pic = new Bitmap(size.CodeWidth, size.CodeWidth); Graphics g = Graphics.FromImage(pic); render.Draw(g, qrCode.Matrix); return pic; } /// <summary> /// 保存图像 /// </summary> public void Save(Bitmap pic, String filePath) { if (System.IO.File.Exists(filePath)) System.IO.File.Delete(filePath); pic.Save(Server.MapPath(filePath), ImageFormat.Png); } public byte[] SaveImage(String path) { FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); //将图片以文件流的形式进行保存 BinaryReader br = new BinaryReader(fs); byte[] imgBytesIn = br.ReadBytes((int)fs.Length); //将流读入到字节数组中 return imgBytesIn; } public byte[] BitmapToBype(Bitmap b) { MemoryStream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); //byte[] bytes= ms.ToArray(); 这两句都可以,至于区别么,下面有解释 ms.Close(); return bytes; }
-
php二维码生成
2020-12-19 12:40:50本文介绍两种使用 php 生成二维码的方法。 (1)利用google生成二维码的...如果需要传递的信息超过2K个字节,请使用POST方式 * @param int $widhtHeight 生成二维码的尺寸设置 * @param string $EC_level 可选纠错 -
产生二维码 生成图片字节流 转base64 base64 转图片文件存储在相对目录
2019-05-22 21:51:27最近做项目遇到了一种常见得需求,起初是生成一个二维码图片,用base64展现在页面上,而后发现这种方式显得页面很乱,于是将其转化为图片文件存储在项目目录当中,返回图片名称供前端引用图片,话不多说,直接上代码...最近做项目遇到了一种常见得需求,起初是生成一个二维码图片,用base64展现在页面上,而后发现这种方式显得页面很乱,于是将其转化为图片文件存储在项目目录当中,返回图片名称供前端引用图片,话不多说,直接上代码:
@RequestMapping("/QrCode") public R getScanCode(@PathVariable("deviceNo") String deviceNo) { //获取要存储文件 得路径 String url = this.getClass().getClassLoader().getResource("").getPath(); //对路劲进行拼接添加 String destPath = url + "statics/img/"; //定义最终文件得名字 String fileName = "scanCode.png"; //将参数传入调用方法 String name = QRCodeUtil.getImage2(codeUrl, url, destPath, fileName); //最后返回文件得名字 return R.ok().put("ScanCodeUrl", name); } public static String getImage2(String codeUrl, String url, String destPath, String fileName) { BufferedImage image = null; String png_base64 = null; String file = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_app" + ".jpg"; try { //生成带有logo的二维码图片 其实这儿就可以存储 //本文演示全过程 image = QRCodeUtil.encode(codeUrl, url + "statics/img/aaa.png", url + "statics/img/aaa.png", true, file); //转化 ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流 ImageIO.write(image, "png", baos);//写入流中 byte[] bytes = baos.toByteArray();//转换成字节 BASE64Encoder encoder = new BASE64Encoder(); //转换成base64串 String png_base = encoder.encodeBuffer(bytes).trim(); //删除 \r\n png_base64 = png_base.replaceAll("\n", "").replaceAll("\r", ""); } catch (Exception e) { e.printStackTrace(); } //将base64转文件 目标文件得位置 64得码 定义得文件名 base64ToFile(destPath, png_base64, fileName); return fileName; } //转化并存储文件 public static void base64ToFile(String destPath, String base64, String fileName) { File file = null; //创建文件目录 String filePath = destPath; //创建文件目录 File dir = new File(filePath); //如果不存在则创建目录 if (!dir.exists() && !dir.isDirectory()) { dir.mkdirs(); } BufferedOutputStream bos = null; java.io.FileOutputStream fos = null; try { //创建的64得解码 注 用什么编码 就用什么解码 这里之前用的是BASE64Encoder 编码就用相应的Decoder BASE64Decoder decode = new BASE64Decoder(); byte[] bytes = decode.decodeBuffer(base64); file = new File(filePath + "/" + fileName); //开始写入文件 fos = new java.io.FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(bytes); } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } //编码生成图片 public static BufferedImage encode(String content, String imgPath, String destPath, boolean needCompress, String imgName) throws Exception { System.out.println(imgPath); BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress); return image; }
最后文件存放的位置是:
target-----classes----statics-----img-----scanCode.jpg
至此生成转化完毕。。。。
-
二维码可以包含多少个字符?
2022-04-17 10:39:05二、QR-Code的最大字符串容量 那么把讨论范围限定在QR码,在4种容错等级下,最多能够包含多少字符呢? 这个问题非常简单,测试一下就知道了: import qrcode for level in 'LMQH': for i in range(200, 1000): try:...一、二维码的种类和容错等级
二维码分为很多种,其中最常用的是
QR Code
二维码。QR码的纠错容量有四个级别,分别是:
- ERROR_CORRECT_L ,L级别,7%或更少的错误能修正;
- ERROR_CORRECT_M ,M级别,15%或更少的错误能修正,是qrcode的默认级别;
- ERROR_CORRECT_Q, Q级别,25%或更少的错误能修正;
- ERROR_CORRECT_H ,H级别,30%或更少的错误能修正。
二、QR-Code的最大字符串容量
那么把讨论范围限定在QR码,在4种容错等级下,最多能够包含多少字符呢?
这个问题非常简单,测试一下就知道了:
import qrcode for level in 'LMQH': for i in range(200, 1000): try: qrcode.make('he11o' * i, error_correction=getattr(qrcode, 'ERROR_CORRECT_' + level)) except Exception: print('%s: %d, ' % (level, 5 * (i - 1)), end='') break
输出结果:
L: 2950, M: 2330, Q: 1660, H: 1270
三、Python库中的函数流程处理
根据上面的测试结果,当容错等级为
M
,可以生成长度不超过2330的字符串二维码。我们可以手动测试一下超过这个长度的情况:
>>> qrcode.make('x' * 2350) Traceback (most recent call last): ... File "D:\Python36\lib\site-packages\qrcode\main.py", line 167, in best_fit raise exceptions.DataOverflowError() qrcode.exceptions.DataOverflowError
根据报错提示,发生在
qrcode.main
库的line 167
,报出了exceptions.DataOverflowError
类型的错误。追查这段代码的位置:
self.version = bisect_left(util.BIT_LIMIT_TABLE[self.error_correction], needed_bits, start) if self.version == 41: raise exceptions.DataOverflowError()
其中
self.version
是二维码的等级大小,合法值应在1-40
的范围内。很显然,当
version
等于41的时候就非法了,二维码太大了,发生报错。进入
qrcode.util
库里面查看BIT_LIMIT_TABLE
的定义,是一个比较复杂的列表推导公式。但是这个数据不依赖于输入,我们可以直接打印出来看看,是一个二维列表,里面总共有4个子列,每个子列里有41个元素。
那就很显然了,4个子表对应二维码的4种纠错等级,41个元素对应二维码的41种尺寸等级。
把这4个子列的最大值打印出来、并且按从大到小的顺序排序:
>> sorted([row[-1] for row in qrcode.util.BIT_LIMIT_TABLE], reverse=True) [23648, 18672, 13328, 10208]
好像和之前测试出来的四个数字
L: 2953, M: 2331, Q: 1663, H: 1273
没有什么关系?不,等等,这不是差了8倍多一点的关系吗?
咱再看看
BIT_LIMIT_TABLE
这个参数命名,BIT
…1个byte
等于8个bit
。这个语法命名还是非常清晰易懂的嘛。那么我们把
BIT_LIMIT_TABLE
里的数值除以8以后,再次测试:limit_table = sorted([row[-1] >> 3 for row in qrcode.util.BIT_LIMIT_TABLE], reverse=True) print('LIMIT_TABLE:', limit_table) string = 'he11o' * 600 for st, lv in zip(limit_table, 'LMQH'): print('%s: ' % lv, end='') for i in range(st - 10, st + 10): try: qrcode.make(string[:i], error_correction=getattr(qrcode, 'ERROR_CORRECT_' + lv)) except Exception: print('%d, ' % (i - 1), end='') break
输出结果:
LIMIT_TABLE: [2956, 2334, 1666, 1276]
L: 2953, M: 2331, Q: 1663, H: 1273发现了很显然的对应关系,和
LIMIT_TABLE
的每一个级别都相差了3个byte
。四、不同字符类型具有不同的数据长度
当我把前面测试文本中的
he11o
换成12345
,同样长度的文本却没有发生报错。推测当二维码中只有数字时,可能会进行某种压缩,以提高信息的传递量。
但是同样的代码测试速度太慢了,改成了二分法测试加速运算:
string = '12345' * 2000 for level in 'LMQH': a = 0 for i in range(16, -1, -1): b = 1 << i try: qrcode.make(string[:a+b], error_correction=getattr(qrcode, 'ERROR_CORRECT_' + level)) a += b except Exception: pass print('%s: %d, ' % (level, a), end='')
输出结果:
L: 7089, M: 5596, Q: 3993, H: 3057
可以发现规律,这组数字等于
LIMIT_TABLE
对应数字的2.4倍减5取整。五、C语言库中的函数流程处理
2.4倍是从哪里出现的?我在Python库的源代码中未能追查到线索。
但是我在另一个开源的QR-Code-generator项目的qrcodegen.c文件中,看到这样一段代码:
其中主要调用的函数
qrcodegen_encodeText
:bool qrcodegen_encodeText(const char *text, uint8_t tempBuffer[], uint8_t qrcode[], ... size_t textLen = strlen(text); ... size_t bufLen = (size_t)qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); struct qrcodegen_Segment seg; if (qrcodegen_isNumeric(text)) { if (qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) goto fail; ... fail: ... return false; }
当调用函数
qrcodegen_calcSegmentBufferSize
的返回值大于bufLen
时,生成二维码失败。而在函数
qrcodegen_calcSegmentBufferSize
中,简单调用了函数calcSegmentBitLength
:testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) { // All calculations are designed to avoid overflow on all platforms if (numChars > (unsigned int)INT16_MAX) return -1; long result = (long)numChars; if (mode == qrcodegen_Mode_NUMERIC) result = (result * 10 + 2) / 3; // ceil(10/3 * n) else if (mode == qrcodegen_Mode_ALPHANUMERIC) result = (result * 11 + 1) / 2; // ceil(11/2 * n) else if (mode == qrcodegen_Mode_BYTE) result *= 8; else if (mode == qrcodegen_Mode_KANJI) result *= 13; else if (mode == qrcodegen_Mode_ECI && numChars == 0) result = 3 * 8; else { // Invalid argument assert(false); return -1; } assert(result >= 0); if (result > INT16_MAX) return -1; return (int)result; }
result
来自于textLen
,是字符串的字节长度。很显然,当二维码的模式属于
NUMERIC
时,对字符串长度进行了10/3
倍的向上取整转换。表达的含义是一个NUMERIC
类型的字符等于10/3
个bit
。而
bit
数目本身是byte
的8倍,所以8/(10/3)=2.4,就是这么来的。那么以此类推,当模式属于
ALPHANUMERIC
时,倍数等于16/11
。模式属于
BYTE
时,倍数等于1
。六、使用Python验证计算结果
for j in range(256): c = bytes([j]) print() print(j, c, end=': ') for level in 'LMQH': a = 0 for i in range(16, -1, -1): b = 1 << i try: qrcode.make(c * (a + b), error_correction=getattr(qrcode, 'ERROR_CORRECT_' + level)) a += b except Exception: pass print('%s: %d, ' % (level, a), end='')
在
qrcode.util
库中,可以看到参数ALPHA_NUM
的定义:ALPHA_NUM = b’0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:’
显而易见,当字符集属于这个范围时,模式将被判定为前面提到的
NUMERIC
。而当字符属于
0-9
的时候,存在额外的规则可将模式判定为MODE_ALPHA_NUM
。如果用一个公式来表示,其中
limit
表示4种容错等级在LIMIT_TABLE
中的对应值,k
表示不同字符模式的压缩系数,在3种模式下分别为2.4
和16/11
和1
。公式可以表示为:int(((limit - 2) - 1 / 8) * k)
生成QR-Code二维码,LMQH四个容错等级的二维码最大字符容量是:
字符类别 L M Q H 0-9 7089 5596 3993 3057 ALPHA_NUM 4296 3391 2420 1852 其他 2953 2331 1663 1273 LIMIT_TABLE 2956 2334 1666 1276 在Python中运行的测试程序符合理论计算结果。
-
生成二维码,返回文件字节码,或将文件转成base64返回
2018-10-15 14:16:47* void TODO 生成不带Logo的二维码,并输出到指定的输出流 */ public static void encode(String content, OutputStream output) throws WriterException, IOException { QRCodeUtil.encode(content, ... -
将二维码图片转字节编译base64在页面显示
2015-03-13 20:28:34// 获得内容的字节数组,设置编码格式 byte[] contentBytes = content.getBytes("utf-8"); // 图片尺寸 int imgSize = 67 + 12 * (size - 1); bufImg = new BufferedImage(imgSize, imgSize, ... -
Java生成二维码,Spring Boot整合ZXing实现二维码生成,支持自定义二维码
2021-04-15 16:26:23Integer logoHeight) throws AppException { // 字节输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { // 生成二维码 BufferedImage bufferedImage = generateQRCode(jsonContent,... -
Java使用itext生成pdf并添加水印、二维码字节流
2020-03-19 13:32:04} // 水印部分加上二维码 ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(get(), "png",out); byte[] b = out.toByteArray(); Image itextimage = Image.getInstance(b); // 水印图片... -
如何使用Java、Servlet创建二维码
2020-12-22 21:26:35归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用。从候车亭、产品包装、家装卖场、汽车到很多网站,都在自己的网页集成...被编码是的数据可以是四种标准数据(数字、字母数字、字节/二进制、汉字)中的一种, -
C#彩色二维码
2018-01-04 17:10:09首先先生成二维码 在给二维码添加图片背景 注意QRCodeVersion与字节有关QRCodeVersion=7 二维码存储字节小于等于120 QRCodeVersion=10字节小于等于200 不是绝对的 有更好的可以留言给我 -
OpenCV + zbar开源库实现摄像头识别二维码
2020-04-06 10:13:23OpenCV+zbar开源库实现摄像头识别二维码,测试验证识别率非常高,已实现简单的应用。 打包源码在VS2013下可以完全编译成功,附加包含OpenCV库及zbar-0.10-setup.exe,zbar-0.10.tar.bz2 下载Demo后需要安装 zbar-... -
二维码插件
2017-08-09 17:48:28二维码插件,js资源 -
微信小程序 获取二维码实例详解
2021-01-03 08:55:06path String 不能为空,最大长度 128 字节 width Int 430(默认) 二维码的宽度 auto_color 。。 line_color 。。 接口B:适用于需要的码数量极多,或仅临时使用的业务场景(永久有效,数量暂无限制,将统一打开... -
二维码jar包
2017-09-27 16:15:55Java利用QRCode.jar包实现二维码编码与解码,把要用的jar包下下来,导入到项目里去。qrcode需要设置一个版本号,这个版本号代表你生成的二维码的像素的大小...另外,版本7的编码的字节数如果超过了119,那么将无法编码 -
日常使用的二维码知多少,从数学的角度对二维码图案进行解析
2021-02-18 14:42:09什么是二维码 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。... -
二维码
2021-05-11 11:33:32二维码依赖Api使用 依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <... -
Java生成二维码
2022-03-22 14:54:39Java生成二维码 -
输入字符串生成二维码的App
2018-08-02 17:39:57用androidstudio和GitHub上的qrcode源码写的一个输入字符串生成二维码的app -
微信二维码支付
2021-02-04 09:45:13/** * 创建二维码 * @param parameterMap:用户订单信息 * @return */ @RequestMapping(value = "/create/native") public Result createNative(@RequestParam Map parameterMap){ Map resultMap = ... -
易语言打造自己的"二维码" 把数据保存到图片,
2022-05-02 15:54:04所以二维码为什么大部分都是黑白两色.当然也有彩色的.但背景肯定是浅色,像素点肯定是深色的.如果前景色和背景色越相近扫描所花费的时间就越长.2.如何把数据转换成像素点写入图片?。已知一个像素(4字节),可以利用的有... -
Java二维码编码识别
2021-07-28 14:10:37二维码原理 将String转成char 将char转成二进制码 补码 存储 在界面上画出二维码 二维码原理 二维码图像存储的信息属于字符信息,如果信息少,黑白块数量也少,反之就同理。 我们用二进制01 来表示成它的... -
鸿蒙系统应用开发之——二维码生成
2021-08-22 17:05:07也可以通过二维码字节流生成二维码。 本文将以一个点击按钮,将输入的字符串生成一个二维码为例。文章末尾附上源代码 限制: 1.当前仅支持生成QR二维码(Quick Response Code)。由于QR二维码算法限制,字符串信息的... -
要读取二维码图像,您需要使用二维码扫描仪或许多可以使用手机摄像头扫描二维码的应用程序
2021-06-16 08:20:38二维码使用四种标准化编码模式(数字、字母数字、字节/二进制和汉字)来高效存储数据; 也可以使用扩展名。 阅读更多(维基百科)。 QR Generator 应用程序完全使用模型视图控制器方法构建在用于后端的 Java SE 和... -
java 生成二维码
2020-12-25 11:16:13/** * * 生成二维码的工具类 * * * @author lg * @date 2020年12月15日 */ public class QRCodeUtils { /** * 生成二维码 * * @param content 二维码的内容 * @return BitMatrix对象 * */ public static ... -
java编写二维码所需jar包
2018-06-27 17:43:45由于QR Code码用特定的数据压缩模式表示汉字,它仅用13bit可表示一个汉字,而四一七条码、Data Martix等二维码没有特定的汉字表示模式,因此仅用字节表示模式来表示汉字,在用字节模式表示汉字时,需用16bit(二个... -
android 用byte[]数组来生成二维码
2017-05-08 16:27:57android 如何不用字符串生成二维码,而是用byte[]数组来生成二维码? -
用 Java 生成和识别二维码就这么简单
2021-11-25 15:06:20大家好,我是青空。 青空最近一直在思考一个问题,Java 能不能做一些比较有意思的事情,但是在...今天青空就先带大家做一个二维码玩玩。现在二维码在我们的生活中非常的常见。在我们的生活、交流、出行等等场景中,都用 -
深入理解二维码生成尺寸
2021-08-27 11:24:07深入理解二维码生成尺寸 详细了解二维码的原理,CSDN这两篇博客不错: 转自MachineChen的博客:http://blog.csdn.net/u012611878/article/details/53167009 转自琦小虾的博客:...