天天看點

linux python實作data matrix 二維碼顯示和處理

Datamatrix原名Datacode,特點是采用二維碼結構, 其發展的構想是希望在較小的條碼标簽上存入更多的資料量。Datamatrix的最小尺寸是目前所有條碼中最小的,尤其特别适用于小零件的辨別,以及直接印刷在實體上。 Datamatrix又可分為ECC000-140與ECC200兩種類型,ECC000-140具有多種不同等級的錯誤糾正功能,而ECC200則透過Reed-Solomon演算法産生多項式計算出錯誤糾正碼。

linux python實作data matrix 二維碼顯示和處理

python已經有較為成熟的庫,用于顯示、識别DataMatrix格式的編碼,常用的有: 1. huBarcode   點選打開連結 ,開源python條碼識别庫,支援下列一維、二維碼的顯示:

  • code128
  • ean13
  • datamatrix
  • qrcode

優點:開源,BSD,GPL或Apache  Licensed. 支援多種編碼。 缺點:dataMatrix目前隻支援最長44個字元。對于大部分産品,應該足夠使用,但更長編碼不能處理.

安裝:支援pip安裝,win7 和ubuntu 下測試完全正常。 (注意:安裝後如運作時發現報告import PIL錯,有可能win7環境沒有PIL庫。将錯誤庫檔案源碼修改一下:

from PIL import Image
           

修改為:

import Image
           

即可。 linux等pip可以打包安裝PIL庫的環境則無該問題)

示例代碼:

從指令行字元串參數生成圖像:

from hubarcode.datamatrix import DataMatrixEncoder
import sys
import logging

logging.getLogger("datamatrix").setLevel(logging.DEBUG)
logging.getLogger("datamatrix").addHandler(logging.StreamHandler(sys.stdout))

if __name__ == "__main__":
    encoder = DataMatrixEncoder(sys.argv[1])
    encoder.save("test.png")
           

如果不直接儲存檔案,而是用于圖像處理,例如增加文字,疊加在其他圖像上等,可以通過StringIO包和Image包,将圖像讀入記憶體中進行處理:

import StringIO as sio
 import Image as im
 import numpy as np
 from hubarcode.datamatrix import DataMatrixEncoder

 
 if __name__ == "__main__":
    encoder = DataMatrixEncoder(sys.argv[1])
    #擷取圖像檔案(png格式)到緩沖
    pngdata = encoder.get_get_imagedata()
    memfile = sio.StringIO(pngdata)
    #用Image庫打開圖像,Image庫可進行的圖像二次編輯,參考PIL
    #barcode成為PIL的PngImagePlugin.PngImageFile類型
    barcode = im.open(memfile)
    #顯示圖檔
    barcode.show()
    #儲存為其他格式.jpg,tif,gif...
    barcode.save(r'c:\test.jpg')
    #顯示尺寸
    print barcode.getbbox()
    #轉換為圖像點陣隊列,NB的numpy庫可以直接将PIL的png對象轉為點陣隊列,即png解碼為圖像行列
    bitmap=np.array(barcode)
    '''
    array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       ...,
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
    '''
    #numpy array轉換為python list,保持矩陣行列
    bitmap_list=bitmap.tolist()
    
           

轉為Image圖像對象或者位圖矩陣後,可以從控制列印機步進電機,到雷射振鏡,到疊加到其他圖像...

2.采用libdmtx庫  點選打開連結 可以自行git下載下傳後編譯,也可以在ubuntu環境通過 sudo apt-get install   libdmtx-utils進行安裝。 可以通過庫作者提供的各類warpper進行開發,參見 libdmtx warpper 此處,還可以通過對指令行的簡單包裝,達到相同的功能。 libdmtx提供了兩個非常簡單的指令:

  • dmtxwrite 
  • dmtxread  

dmtxwrite 可以以内容是需編碼的字元串的檔案名作為參數,或者從标準輸入中讀取編碼字元串,再将png各式輸出到标準輸出: 例如 echo hello world|dmtxwrite>hello.png   即可生成hello.png,内容為datamatrix編碼的"hello world". 據此,可以通過python popen讀取shell指令和結果:

import os
import sys
import Image as im
import StringIO as sio

print len(sys.argv)

if  len(sys.argv) <= 1:
	print 'no barcode string input.'
	exit(-1)
else:	
	shellcmd = 'echo ' + sys.argv[1] +'|dmtxwrite'
	print 'shell is %s' % shellcmd
	pngfile=im.open(sio.StringIO(os.popen(shellcmd).read()))
	pngfile.show()
	exit(0)
           

類似的,pngfile對象如同上一個代碼例子,可以通過PIL庫進行轉換,或者numpy庫提取點陣矩陣。