python調用MINILZO

摘要

LZO 是一個用 ANSI C 語言編寫的無損壓縮庫。他能夠提供非常快速的壓縮和解壓功能。解壓並不需要內存的支持。即使使用非常大的壓縮比例進行緩慢壓縮出的數據,依然能夠非常快速的解壓。LZO 遵循 GNU 的 GPL 使用許可。

應用到嵌入式平臺(前言)

最近有個項目需要,將圖片數據下載到MCU(基於M4)中,使用串口或者網口進行下載。由於LZO體積比較小,對資源消耗也小,尤其是解壓時不需要額外開闢工作期間。因此打算,上位機對圖片進行壓縮,MCU(基於M4)對數據進行解壓。在上位機端,使用python下載,但是發現未直接可以使用的LZO, 切版本也不一定對應上,針對嵌入式平臺,採用miniLZO, 所以採用:

     將miniLZO編譯爲動態庫(.DLL或者.SO),然後python調用動態庫的方式進行數據壓縮;

而MCU端直接使用miniLZO 源碼加入編譯;

 

編譯miniLZO動態庫

環境: 使用MINGW+eclipse編譯動態庫, 當然也可以使用visual studio

miniLZO源碼:http://www.oberhumer.com/opensource/lzo/#download ,  我使用的版本是minilzo-2.10.tar.gz

 

step1: 在eclipse CDT中,新建C共享庫工程,比較簡單,省略;

step2:將源碼中lzocfg.h, lzodef.h, minilzo.c , minilzo.h添加到工程;如下圖所示:

                                 

step3:修改源碼,將lzo_init函數的宏定義實現改爲函數實現, 否則python無法訪問到lzo_init

修改前:

修改後:

void lzo_init(void)
{
	__lzo_init_v2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\
	(int)sizeof(long),(int)sizeof(lzo_uint32_t),(int)sizeof(lzo_uint),\
	(int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\
	(int)sizeof(lzo_callback_t));
}

step4:編譯,編譯成功後會生成libminilzo_so.dll

 

python調用libminilzo_so.dll

參考代碼:

if __name__ == "__main__":
    im = Image.open("image.png")
    print(im.size)
    print(im.format)
    print(im.getpixel((0,0)))
    print(len(list(im.getdata())))
    #print(list(im.getdata()))

    lzo = CDLL('./libminizo_so.dll')
    result = lzo.lzo_init()
    print(result)

    data = list(im.getdata())
    in_len = 1024

    input = c_byte * 25600
    input_data = input()
    for i in range(25600):
        input_data[i] = data[i]

    wrkmem = c_byte * (25600*2)
    wrkmem_data = wrkmem()
    out = c_byte * 25600
    out_data = out()
    out_len = c_char_p

    outlen = c_int * 1
    outlen_data = outlen()
    r = lzo.lzo1x_1_compress( input_data, in_len, out_data, outlen_data, wrkmem_data)

    print("r: "+ str(r))
    print("outlen:"+ str(outlen_data[0]))
    #print("out:"+out_data)
    #print(out)

 

參考博客:

壓縮算法性能比較: https://www.cnblogs.com/xd502djj/p/4690146.html

官網: http://www.oberhumer.com/opensource/lzo/#download

發一個單片機可用的無損數據壓縮算法(miniLZO)源碼及測試工程: http://www.embed-net.com/thread-192-1-1.html

miniLZO無損壓縮庫評估: https://blog.csdn.net/xiaoxianerqq/article/details/78119983

LZO 使用和介紹: https://www.cnblogs.com/fnlingnzb-learner/p/5843367.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章