【VB.NET】利用 ZXing.Net 生成二维码(支持自定义LOGO)
ZXing .NET 的项目主页
https://github.com/micjahn/ZXing.Net
代码基本上抄袭自下面两篇文章 XD
https://www.cnblogs.com/tianma3798/p/5426869.html
https://www.cnblogs.com/tianma3798/p/5426880.html
仅作参数优化,更加实用和简便一点
条形码生成
里面的1D格式应该就是各类条形码的格式描述
条形码的读取十分简单,可以直接使用上面的
https://github.com/micjahn/ZXing.Net
代码基本上抄袭自下面两篇文章 XD
https://www.cnblogs.com/tianma3798/p/5426869.html
https://www.cnblogs.com/tianma3798/p/5426880.html
仅作参数优化,更加实用和简便一点
Shared Function MakeQR(ByVal qrtext As String, Optional ByVal width As Integer = 800, Optional ByVal height As Integer = 800, Optional ByVal margin As Integer = 1) As Bitmap
Dim writer As New ZXing.BarcodeWriter
writer.Format = ZXing.BarcodeFormat.QR_CODE
Dim opt As New ZXing.QrCode.QrCodeEncodingOptions
opt.DisableECI = True '设置为True才可以调整编码
opt.CharacterSet = "UTF-8" '文本编码,建议设置为UTF-8
opt.Width = width '宽度
opt.Height = height '高度
opt.Margin = margin '边距,貌似不是像素格式,因此不宜设置过大
writer.Options = opt
Return writer.Write(qrtext)
End Function
Shared Function MakeQR(ByVal qrtext As String, ByVal logo As Bitmap, Optional ByVal width As Integer = 800, Optional ByVal height As Integer = 800, Optional ByVal margin As Integer = 1) As Bitmap
If logo Is Nothing Then
Return MakeQR(qrtext, width, height, margin)
End If
Dim writer As New ZXing.MultiFormatWriter
Dim hint As New Dictionary(Of ZXing.EncodeHintType, Object)()
hint.Add(ZXing.EncodeHintType.CHARACTER_SET, "UTF-8")
hint.Add(ZXing.EncodeHintType.MARGIN, margin)
hint.Add(ZXing.EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H)
' 生成二维码
Dim bm As ZXing.Common.BitMatrix = writer.encode(qrtext, ZXing.BarcodeFormat.QR_CODE, width, height, hint)
Dim barcodeWriter = New ZXing.BarcodeWriter()
Dim bmp As Bitmap = barcodeWriter.Write(bm)
'获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
Dim rectangle As Integer() = bm.getEnclosingRectangle()
'计算插入图片的大小和位置
Dim middleW As Integer = Math.Min((rectangle(2) / 3.5), logo.Width)
Dim middleH As Integer = Math.Min((rectangle(3) / 3.5), logo.Height)
Dim middleL As Integer = (bmp.Width - middleW) / 2
Dim middleT As Integer = (bmp.Height - middleH) / 2
'将img转换成bmp格式,否则后面无法创建Graphics对象
Dim bmpimg As New Bitmap(bmp.Width, bmp.Height, Imaging.PixelFormat.Format32bppArgb)
Using g As Graphics = Graphics.FromImage(bmpimg)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g.DrawImage(bmp, 0, 0)
End Using
'将二维码插入图片
Using myGraphic As Graphics = Graphics.FromImage(bmpimg)
'白底
myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH)
myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH)
End Using
bmp.Dispose()
Return bmpimg
End Function
Shared Function ReadQR(ByVal bmp As Bitmap) As String
Dim reader As New ZXing.BarcodeReader
reader.Options.CharacterSet = "UTF-8"
Dim ret As ZXing.Result = reader.Decode(bmp)
If ret Is Nothing Then
Return Nothing
Else
Return ret.Text
End If
End Function
条形码生成
Shared Function MakeITF(ByVal qrtext As String, Optional ByVal height As Integer = 100) As Bitmap
Dim opt As New ZXing.Common.EncodingOptions
opt.Height = height '条形码仅建议使用高度选项
Dim writer As New ZXing.BarcodeWriter
writer.Format = ZXing.BarcodeFormat.ITF '条形码格式并非只有ITF一种
writer.Options = opt
Return writer.Write(qrtext)
End Function
ITF条形码使用限制比较多:- 内容仅限数字
- 字符长度必须为偶数,如果你的内容长度不足请填0补足
- 字符长度最大为80
里面的1D格式应该就是各类条形码的格式描述
条形码的读取十分简单,可以直接使用上面的
ReadQR
进行读取!本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
大神,我引用的4.8zxing,打算做个excel的插件,在vs中调试都是OK的。用inno打包后就不行了。我试过将zxing.dll和zxing.presentation.dll打包到zxing文件夹,或者打包到当前文件夹,都是不能使用。引用的另一个叫chinese的就可以正常使用。能帮忙看下有可能是什么问题吗?
抱歉,没做过Excel开发,大概提供不了什么帮助。我觉得很可能与系统环境或者COM加载之类的有关系,建议多给源码加一些调试代码,或者github上找一些类似项目。
大神 可否指点一下 我需要用ZXING 生成一个DM码 就一个按钮和一个PictureBox 感谢 感谢 感谢! 按一下按钮生成一个二维码
将生成的格式换成 writer.Format = ZXing.BarcodeFormat.DATA_MATRIX 应该就可以了。
怎么简单生成一个二维码呢 我这把你代码全部复制到VS里面 没有效果啊 放了一个按钮和PictureBox ?求大神告知一下
贴代码以后遇到,类型"UnityEngine.Color32的1维数组”的值无法转换为“ System.Drawing. Bitmap”,这个问题怎么解决。
你这是UE引擎的问题,不是代码的问题。
可能是引擎的某个类与.NET内部的类型出了冲突吧?
如果是条形码呢?小白求发源码
ojbk