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);
應考慮哪些參數,以獲得最快的解壓?
一件事是嘗試與PNG過濾器壓縮型無。 –
圖像的性質是什麼?黑與白,許多灰度或許多顏色? –
@ GlennRanders-Pehrson當我保存壓縮級別0時,圖片大小增加了7倍。當我使用壓縮級別1時,大小隻有1.4倍,然後是級別6.您知道每個壓縮級別的解壓縮時間的因素?或者這是否嚴格依賴於CPU? – harper