摘要
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