• 2

利用Gnu license library 來製作 Qrcode離線版+webcam掃描(vba範例)

(***此文只在mobile01發表,如轉貼到其它論譠、bolg,請附上來源網址,謝謝***)
(5樓,更新另一種版本的範例,可在x32 x64 excel執行)
(9樓,新增簡易版 webcam掃描範例)
(11樓,使用“鐵蛋”這位高手提供的zbar+vbs,重新改寫成vba版webcam連續掃描範例)

Qrcode 如果用純 vba ,不利用任何 library ,程式碼會很長
新手想要搞懂,會很辛苦
不含lib的“純vba”版,以下2個網址,有範例可下載,有興趣可看看,但程式碼很長喔
https://stackoverflow.com/questions/16143331/generating-2d-pdf417-or-qr-barcodes-using-excel-vba
https://code.google.com/archive/p/barcode-vba-macro-only/downloads


如果改用線上版,雖然程式碼變短、易懂,但沒網路時,很不方便
google線上轉圖簡易範例,迴圈要改成function可參考這篇
https://www.mobile01.com/topicdetail.php?f=511&t=5019053



有想過把以前寫的純vba版,po上來,可是想到這裡不是程式論譠
po 上來,也只有被拿去,複製=>貼上=>執行 ,根本沒人想看看內容,學習一下

所以就google看看是否有用library的範例,因為利用library的話,程式會很好寫
結果發現qrcode library 免費的、付費的,都有很多種
獨立程式一大堆,c++、java、vb.net... 等等範例也一大堆

不知道是不是我搜尋方式不對,就是找不到for excel vba library的範例
所以就寫一個簡單的範例給大家參考

如果圖形大小、編碼、容錯率、位置…都不管,只要2行程式碼就可以產生1個圖形
只要多幾行,就可以定義大小、編碼、顏色……等等,再加上迴圈就可以大量產生
最麻煩的是那些變數,因為沒得參考,花了我一些時間測試

利用Gnu license library 來製作 Qrcode離線版+webcam掃描(vba範例)


程式說明
這個Qrcodelib.dll 是 Gnu license library(開源程式),總共有12個變數
一、名稱 FullQrCode ,是固定的不能改,大小寫要一樣
二、變數說明(以下變數排列順序跟程式碼內相同)
1 autoConfig 自動調整qrcode version
2 autofit 自動調整
3 backcolor 背景色
4 forecolor 前景色
5 qtext 要轉的文字
6 level 容錯率 0=7% 1=15% 2=25% 3=30%
7 encoding 選擇文字類型,要用的編碼
=>0 大小寫英文、符號、數字
=>1 轉成 8-bit
=>2 只有數字
=>3 kanji 好像是日文之類的,編碼在8140-9ffc e040-ebbf
=>4 自動選擇 (如果轉中文出錯,請改使用 1)
8 pixels 邊界,像素為單位
9 moduleWidth qrcode 點的大小,像素為單位
10 height qrcode高度
11 width qrcode寬度
12 finename 存檔路徑+檔名

'===呼叫 qrcodelib.dll 函式庫,快速產生 Qrcode============================
'===範例文字放在 a1~a5,產生的圖形會放在 b1~b5==========================
Private Declare Sub FullQRCode Lib "qrcodelib.dll" _
(ByVal autoConfig As Boolean, _
ByVal AutoFit As Boolean, _
ByVal backColor As Long, _
ByVal foreColor As Long, _
ByVal qtext As String, _
ByVal Level As Integer, _
ByVal encoding As Integer, _
ByVal pixels As Integer, _
ByVal moduleWidth As Integer, _
ByVal Height As Integer, _
ByVal Width As Integer, _
ByVal FileName As String)

Sub test()

For i = 1 To 5
FullQRCode True, False, vbWhite, vbBlack, Cells(i, 1), 0, 4, 2, 3, 100, 100, "c:\temp.bmp"
Set q = ActiveSheet.Shapes.AddPicture("c:\temp.bmp")
'Set q = ActiveSheet.Pictures.Insert("c:\temp.bmp")
q.Left = Cells(i, 2).Left
q.Top = Cells(i, 2).Top
q.Height = 100
q.Width = 100
Next

End Sub

'====================================================================

只有 Private Declare Sub 那一串是固定不變的
產生圖形只需1行,插入excel ,也只用1行,2行調整位置
夠簡單吧,就算只會寫for next迴圈的新手,也看的懂
剩下的,請自行變化、改寫,有興趣的拿去用吧


(注意,下載後,請把qrcodelib.dll放到c:\windows(預設) ,不行就改放到 c:\windows\system32)
(想自訂位置,請修改第一行的 "qrcodelib.dll" =>例如 "c:\abc\qrcodelib.dll")
附加壓縮檔: 201701/mobile01-a6b8ccd3d6e9e68c06e0379cf98f0b0b.zip
2017-01-10 5:23 發佈
很好的分享, 正有需要, 謝謝您提供的資訊
謝謝你,很簡潔的作法.也正好解決了我的問題.
有趣的東西,留下來,也許可以 改裝到我的 報價系統上

這麼久的文章,居然還有人看…
再更新一下好了,增加另一種寫法
各種常見1維、2維條碼編碼 + 解碼(圖片、名片…等等) for excel x32 x64 vba 離線版範例
這是使用另一種開源函式庫的vba範例,可以產生很多種類的條碼,也多了一個解碼功能


需要一點前置作業,也可以參考這篇文章
https://www.mobile01.com/topicdetail.php?f=511&t=5190298&p=1#64847077


前置作業
一、至少要有 .net framework 4.0 (或以上)
二、把附件中的zxing.interop.dll zxing.dll 2個檔案,放到c:\windows\
三、登錄程式庫,使用系統管理員權限執行命令提示字元(cmd),需先關閉excel
這裡要注意一下32、64位元,不要選錯目錄

32位元 excel
進入目錄 C:\Windows\Microsoft.NET\Framework\v4???????
執行
RegAsm.exe c:\windows\zxing.interop.dll /tlb: Zxing32.tlb /codebase

64位元 excel
進入目錄 C:\Windows\Microsoft.NET\Framework64\v4??????
執行
RegAsm.exe c:\windows\zxing.interop.dll /tlb: Zxing64.tlb /codebase

正確執行的話,會出現如圖片中的訊息


(如果想移除程式庫註冊,先關閉excel,最後加上unregister,像這樣 ... /codebase /unregister )

四、打開excel,進入visual basic
=>工具=>設定引用項目=>瀏覽=>根據您的excel版本,選 Zxing32.tlb 或 Zxing64.tlb
或是在可引用的項目內找看看有沒有
"ZXing.Net: prot of th java based barcode scanning library for .net"
打勾,按確定

五、把程式碼放到模組裡



'======================================================
'程式功能,使用 a1~a5 的內容,產生qrcode圖形,放在 b1~b5
'產生 qrcode 、解碼 qrcode ,為主要範例,其它條碼種類,請自行修改

'解碼的文字,放在 a6
'======================================================
Sub 編碼()

Dim QR As IBarcodeWriter, Options As QrCodeEncodingOptions, TempPatch As String
Set Options = New QrCodeEncodingOptions
Set QR = New BarcodeWriter
Set QR.Options = Options

TempPatch = "c:\temp\"

'注意:win10系統,避免權限問題造成程式出錯
'暫存檔位置不要放在根目錄,建議改到目錄內(例如:桌面)


If Dir(TempPatch, vbDirectory) = "" Then
MsgBox TempPatch & " <=暫存目錄未建立", vbOKOnly, "Error"
Exit Sub
End If

If Dir(TempPatch) <> "" Then Kill TempPatch & "*.bmp"

'注意:如果想自訂暫存目錄名稱,程式執行前,需100%確定暫存目錄的位置是否正確
'kill指令會在無任何提示下刪除所指定的檔案



With Options
.ErrorCorrection = ErrorCorrectionLevel_H '容錯率
.CharacterSet = "UTF-8"
'先調大,插入圖片時再縮小,可避免解析度不足
.Height = 100 '高
.Width = 100 '寬
.Margin = 1 '邊界
End With


QR.Format = BarcodeFormat_QR_CODE '條碼種類


Sheets("工作表1").Shapes.SelectAll
Selection.Delete


For i = 1 To 5 '暫定5筆資料

'產生暫存圖檔,也可改成jpg、png…等等其它圖檔格式
QR.WritePngToFile Cells(i, 1), TempPatch & i & ".bmp"

'如果電腦效能不好,這裡需加入適當的延遲時間
Delaytick (0.2)

Set q = Sheets("工作表1").Shapes.AddPicture(TempPatch & i & ".bmp", False, True, 1, 1, 1, 1)
'Set q = sheets("工作表1").Pictures.Insert(TempPatch & i & ".bmp")
q.Left = Cells(i, 2).Left
q.Top = Cells(i, 2).Top
q.Height = 100
q.Width = 100

Next

End Sub


Sub Delaytick(setdelay As Single)

Dim StartTime As Double, NowTime As Double
StartTime = Timer * 100
setdelay = setdelay * 100
Do
NowTime = Timer * 100
DoEvents
Loop Until NowTime - StartTime > setdelay

End Sub



Sub 解碼()

'請自己找圖片測試,雖然慢了點,但都可以正確解碼

Dim read As IBarcodeReader, decode As Result
Set read = New BarcodeReader

read.Options.PossibleFormats.Add BarcodeFormat_QR_CODE '條碼種類
'載入硬碟中的圖檔解碼,也可改成jpg、png…等等其它圖檔格式
Set decode = read.DecodeImageFile("c:\temp.bmp")
'在a6放入解碼訊息
Cells(6, 1) = decode

End Sub

'==================================================================




容錯率修改方式,四選一
ErrorCorrectionLevel_H
ErrorCorrectionLevel_L
ErrorCorrectionLevel_M
ErrorCorrectionLevel_Q

條碼種類修改方式,20選一,但要注意,不同的條碼,有不同的文字規則
有些只能數字,有些有字數限制,有些必需要加入同位元檢查碼
詳細規則,請自行google

BarcodeFormat_AZTEC
BarcodeFormat_CODABAR
BarcodeFormat_CODE_128
BarcodeFormat_CODE_39
BarcodeFormat_CODE_93
BarcodeFormat_DATA_MATRIX
BarcodeFormat_EAN_13
BarcodeFormat_EAN_8
BarcodeFormat_IMB
BarcodeFormat_ITF
BarcodeFormat_MAXICODE
BarcodeFormat_MSI
BarcodeFormat_PDF_417
BarcodeFormat_PLESSEY
BarcodeFormat_QR_CODE
BarcodeFormat_RSS_14
BarcodeFormat_RSS_EXPANDED
BarcodeFormat_UPC_A
BarcodeFormat_UPC_E
BarcodeFormat_UPC_EAN_EXTENSION

解碼注意事項:
解碼副程式中的“條碼種類”,需改成和圖片中的條碼種類一樣
但是可以用.PossibleFormats.Add 多選幾種,不過速度會變慢


64位元範例檔案(內含函式庫)
(32位元excel要使用,需重新設定引用項目Zxing32.tlb)


[點擊下載]
感謝您的分享,我一直以為這版的Zxing只能用在64bit的系統,結果是.dll註冊方式不同,原廠zip檔的批次檔寫法不同,還好有找到您介紹的這篇,終於可以在我老舊的XP上執行了Zxing!

另外想請教一下,是否有用Zxing當core寫的免費Webcam Barcode Scanner可推薦的? 目前我用Zbar,但Zbar不支援Data Matrix,而Zbar似乎也停止開發了,目前還沒試到合用的..
後來我發現zxing.interop.dll這個檔案,目前ZXing.Net.0.16.0.0.zip內的與您提供的版本相同,但內容不同,換上您的才能正常註冊,看來原廠不知道動到什麼,想說怎麼這麼奇怪..
鐵蛋 wrote:
是否有用Zxing當core寫的免費Webcam Barcode Scanner可推薦的?...(恕刪)


不好意思,我不知道,因為我用不到產生條碼、解碼條碼的功能,更不用說Webcam即時掃描解碼 for Excel
這些範例是因為 google 其它論譠後,發現沒人寫過,再加上zxing官方給的資料也不正確,所以寫好玩的

試寫一下(目前完成度90%),開啟webcam => 抓圖 =>丟給 zxing 解碼
發現不管速度的話,可利用第3方webcam工具,其實不難
程式碼大約20行吧,也許會po上來

如果速度要快(目前完成度70%,暫時不能當範例,可能不會po) => 即時預覽webcam畫面 => 抓圖 => 丟給zxing 解碼
就不能用第3方webcam工具,連續大量抓圖時,速度不夠
也不能用開源函式庫,因為google到可正常執行的webcam library都是xp版本,不然就是C語言用的
win7只能用vba從頭寫過





範例功能,在excel中,開啟webcam(視訊),即時預覽抓取圖片後,解碼qrcode


這是使用開源工具CommandCam.exe ,製作的webcam抓圖範例
搭配zxing可做出簡易慢速版的,qrcode掃描工具 for excel

前置作業
一、請考前面幾篇文章
二、自己做一個excel 工作表,需按鈕1個(執行getwebcam巨集),activex 圖像控制項1個
三、程式碼放在模組裡
四、先存檔
五、把附件中的CommandCam.exe,和工作表放在一起,或自行改程式碼換位置

、=========================================

Sub GetWebcam()

Dim Report, Target, pic
Target = ActiveWorkbook.Path & "\"
pic = Target & "temp.bmp"
Cells(6, 1) = ""
If Dir(pic) <> "" Then
Kill (pic): Do Until Dir(pic) = "": Loop
End If
Report = Shell(Target & "CommandCam.exe /preview /delay 5000 /filename """ & pic & """", vbHide)

Application.Wait (Now + TimeValue("00:00:08"))

If Dir(pic) = "" Then
Cells(6, 1) = "nopic"
Exit Sub
End If

Sheets(1).Image1.Picture = LoadPicture(pic)


解碼 (pic)

End Sub


Sub 解碼(pic As String)


Dim read As IBarcodeReader, decode As Result
Set read = New BarcodeReader

read.Options.PossibleFormats.Add BarcodeFormat_QR_CODE
Set decode = read.DecodeImageFile(pic)
If decode.Text = "" Then
Cells(6, 1) = "decode error"
Else
Cells(6, 1) = decode
End If

End Sub

'=======================================================
注意事項
一、部份舊型 webcam 不相容即時預覽
無法看到畫面的,請把 /preview 刪掉,但還是可以抓圖

二、 /delay 5000(等5秒後抓圖),TimeValue("00:00:08"))等8秒(多等3秒)
避免圖片抓好後,來不及存檔,時間可自行調整

三、掃描解碼能力,是webcam品質+ zxing 的問題,別問我如何加強

四、要解碼的條碼種類,請自行修改程式碼(5樓)

五、附件中的readme有commandcam的完整說明(英文的),調解析度…等等的,請自行閱讀

六、因為commandcam是exe檔,怕不安全的話,請放棄這個範例,不要用


附加壓縮檔: 201709/mobile01-12518779d5d558c3be18d472ac72ade7.zip


另一個不用commandcam.exe,只用vba可連續解碼的版本,請參考這篇文章,會快很多
不用第3方工具來啟動webcam的方式
https://www.mobile01.com/topicdetail.php?f=511&t=5283687

感謝您的分享,我透過CommandCam.exe抓下視訊畫面測試ZXing.Net跟Zbar這兩個程式,發現ZXing.Net with VBA (COM Interop)好像有問題,無法辨識出QR-Code,後來才發現,不能辨識超過一個,查了原始網站,似乎沒提到是否有設定可以設,不過Zbar的Zbarimg,則可一次帶出全部找到的QR-Code,我將啟用ZBar的.vbs程式寫在這裡,有興趣的可以試著用看看,我是覺得速度真的很快,很可惜沒繼續維護了,有些條碼規格沒支援,例如Data Matrix就沒有支援。

Zbar安裝程式:
https://sourceforge.net/projects/zbar/files/zbar/0.10/zbar-0.10-setup.exe/download

兩個VBS腳本:


腳本1:
Zbar_SendKey_Hiden.vbs
---------------------------------------------------------------------
CreateObject("WScript.Shell").Run "cscript Zbar_SendKey.vbs", 0, True
---------------------------------------------------------------------

腳本2:
Zbar_SendKey.vbs
---------------------------------------------------------------------
Dim oShell
Dim oExec
Dim FSO
Dim oFile
Dim Text

Dim strZbar

strZbar = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%ProgramFiles%") & "\ZBar\bin\zbarcam.exe --prescale=320x240"
Set wobj = WScript.CreateObject("WScript.Shell")
Set oShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

set oExec = oShell.Exec(strZbar)

'如果程式還開著,則檢測是否有由StdOut來的資料,有的話SendKey方式傳出
Do While oExec.Status = 0
Text = oExec.StdOut.ReadLine
If Text <> "" Then
beep(1)
Text = Replace(Text,"QR-Code:","")
wobj.SendKeys Text & vbCr
End If
WScript.Sleep (100)
Loop

'發出beep聲
Function beep(iTimes)
Set oShell = CreateObject("Wscript.Shell")
Dim iTemp
For iTemp = 1 To iTimes
oShell.Run "%comspec% /c echo " & Chr(7), 0, False
Wscript.Sleep 300
Next
End Function
---------------------------------------------------------------------

存起來後,開啟Zbar_SendKey_Hiden.vbs這個腳本,就會隱藏Zbar的命令畫面,只會顯示Webcam的畫面,然後開啟Excel或者要掃入條碼的欄位,進行掃描後,就會幫你按出這些條碼文字。
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?