小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

最簡(jiǎn)GIF解析代碼gif_jumper,用于stb_image的小改進(jìn)

 行者花雕 2022-08-16 發(fā)布于北京

gif jumper

 

gif支持多幀動(dòng)畫(huà),但是沒(méi)有存儲(chǔ)總幀數(shù),解析gif直到結(jié)束才能知道總幀數(shù)。

所以gif解析代碼,要么采用鏈表,要么不停realloc()分配內(nèi)存,stb_image的代碼就是如此。

出于本人的強(qiáng)迫癥,于是寫(xiě)了一段代碼,迅速“跳過(guò)”解析過(guò)程,返回總幀數(shù),聊勝于無(wú),僅供參考:

同時(shí)也可以作為gif格式的幫助文檔,畢竟最好的文檔就是代碼。

 

格式

 

  • GIF文件頭(Header)
  • 邏輯屏幕描述塊(Logical Screen Descriptor)
  • 全局彩色表(GlobalColor Table)
  • 圖像描述塊(Image Descriptor)
  • 局部彩色表(Local Color Table)
  • 圖形控制擴(kuò)展塊(Graphic Control Extension)
  • 注釋擴(kuò)展塊(Comment Extension)
  • 應(yīng)用擴(kuò)展塊(Application Extension)
  • 無(wú)格式文本擴(kuò)展塊(PlainText Extension)
  • 文件結(jié)束塊(Trailer)

 

源碼

#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文件格式詳解

gif 格式圖片詳細(xì)解析

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多