gif_jumper:
gif支持多幀影片,但是沒有存盤總幀數,決議gif直到結束才能知道總幀數,
所以gif決議代碼,要么采用鏈表,要么不停realloc()分配記憶體,stb_image的代碼就是如此,
出于本人的強迫癥,于是寫了一段代碼,迅速“跳過”決議程序,回傳總幀數,聊勝于無,僅供參考:
同時也可以作為gif格式的幫助檔案,畢竟最好的檔案就是代碼,
原始碼:
#define JUMP(c, offset) c+=offset #define INT8(n, offset) n=*offset #define INT8_BIT(n, offset, s, e) n=(unsigned char)((*offset)<<s)>>(s+7-e) static int gif_jumper(unsigned char *start, unsigned char *end) { int num=0; int frames=0; unsigned char *cur=start; JUMP(cur, 6); // Header(6bytes) JUMP(cur, 4); // Logical Screen Descriptor(7bytes) INT8_BIT(num, cur, 0, 0); // Global Color Table Flag if(num) { INT8_BIT(num, cur, 5, 7); // Size of Global Color Table = 2^(pixel+1) JUMP(cur, 3+3*(1 << (num+1))); } else { JUMP(cur, 3); } while(cur<end) { INT8(num, cur); switch(num) { case 0x2C: // Image Descriptor(9bytes) frames++; JUMP(cur, 1+8); INT8_BIT(num, cur, 0, 0); // Local Color Table Flag if(num) { INT8_BIT(num, cur, 5, 7); // Size of Local Color Table = 2^(pixel+1) JUMP(cur, 1+3*(1 << (num+1))); } else { JUMP(cur, 1); } JUMP(cur, 1); // LZW Minimum Code Size while(cur<end) { INT8(num, cur); // Table-Based Image Data JUMP(cur, 1+num); if (num==0) { break; // Block Terminator } } break; case 0x21: // Extension JUMP(cur, 2); // Extension Introducer while(cur<end) { INT8(num, cur); // Table-Based Image Data JUMP(cur, 1+num); if (num==0) { break; // Block Terminator } } break; case 0x3B: // Trailer JUMP(cur, 1); break; default: return 0; } }; return frames; }
后記:
由于網站告訴我:
- 文字少的博文不允許投稿到該網站分類
不得不再來啰嗦幾句,這么多代碼不允許投稿?代碼不算字數?還是我沒有設定字體,沒有圖片?真心希望多關心關心內容,而不是形式,
參考檔案:
《GIF檔案格式詳解》https://blog.csdn.net/Swallow_he/article/details/76165202
《gif 格式圖片詳細決議》https://blog.csdn.net/wzy198852/article/details/17266507
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256623.html
標籤:其他
上一篇:C語言高級部分總結
