2014-03-04 106 views
3

我有一個帶LCD顯示器的微控制器。我需要顯示幾個PNG圖像。由於微控制器的性能有限,顯示圖像的時間太長。使用libpng提高性能

我做了基準測試,發現大部分時間都花在libpng上,而不是訪問顯示內存或(壓縮)文件所在的存儲空間。

  • 我可以在將PNG文件傳送到微控制器之前操作PNG文件。
  • 數據實際上是在png_set_read_fn註冊的回調函數內部讀取的。

編輯: 圖片編碼爲每個顏色8位加上透明度導致每像素32位。但大部分圖片都有灰色。

這裏是我用來轉換功能序列:

png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, show_png_error, show_png_warn); 
info_ptr = png_create_info_struct(png_ptr); 
end_info = png_create_info_struct(png_ptr); 
png_set_user_limits(png_ptr, MAX_X, MAX_Y); 
png_set_read_fn(png_ptr, 0, &read_callback); 
png_set_sig_bytes(png_ptr, 0); 
png_read_info(png_ptr, info_ptr); 
png_read_update_info(png_ptr, info_ptr); 
result->image = malloc(required_size); 
height = png_get_image_height(png_ptr, info_ptr); 
png_bytep *row_pointers = malloc(sizeof(void*) * height); 

for (i = 0; i < height; ++i) 
    row_pointers[i] = result->image + (i * png_get_rowbytes(png_ptr, info_ptr)); 

png_set_invert_alpha(png_ptr); 
png_read_image(png_ptr, row_pointers); 
png_read_end(png_ptr, end_info); 
free(row_pointers); 
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); 

應考慮哪些參數,以獲得最快的解壓?

+0

一件事是嘗試與PNG過濾器壓縮型無。 –

+0

圖像的性質是什麼?黑與白,許多灰度或許多顏色? –

+0

@ GlennRanders-Pehrson當我保存壓縮級別0時,圖片大小增加了7倍。當我使用壓縮級別1時,大小隻有1.4倍,然後是級別6.您知道每個壓縮級別的解壓縮時間的因素?或者這是否嚴格依賴於CPU? – harper

回答

2

這取決於圖像的性質。

對於照片,pngcrush方法12(過濾器類型1,zlib策略2,zlib等級2)效果很好。對於256或更少顏色的圖像,方法7(過濾器類型0,zlib等級9,zlib策略0)效果良好。

方法12也碰巧是一個非常快速的壓縮機,但據我所知,這對你無關緊要。 zlib策略2是僅霍夫曼壓縮,因此對於任何非零zlib壓縮級別,結果都是相同的。

在你的代碼,以獲得相同的行爲pngcrush方法7,使用

png_set_compression_level(png_ptr, 9); 
png_set_compression_strategy(png_ptr, 0); 
png_set_filter(png_ptr,PNG_FILTER_NONE); 

,並獲得pngcrush方法12的行爲,

png_set_compression_level(png_ptr, 2); 
png_set_compression_strategy(png_ptr, 2); 
png_set_filter(png_ptr,PNG_FILTER_SUB);