| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1251 人关注过本帖
标题:为什么有的gif图像只能读出一部分数据?
只看楼主 加入收藏
justwant
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2008-6-8
收藏
 问题点数:0 回复次数:4 
为什么有的gif图像只能读出一部分数据?
同样的程序,一副图像可以读出它的全局色彩表(Globle color Table),而有的图像却只能读出全局色彩表的一部分,后面的数据全为0,到底为什么啊?
对于一副gif图像,可以用UltraEdit-32打开
#include<stdio.h>

int main()
{
    FILE *fp;
    unsigned char Hd[6]={};
    unsigned char LGC[7]={};
    unsigned char GCT[768]={};
    unsigned char CrlE[8]={};
    unsigned char ImgD[10]={};
    unsigned char T_B_minicode[10]={};
    unsigned char T_B_data[]={};


    int i,j;

    fp=fopen("f.gif","r");

    fread(Hd,sizeof(char),6,fp);           /*read gif head*/
    printf("The GIF Header is:\n");
   
    for(i=0;i<6;i++)                      /*show head in stdout*/
    printf("%c",Hd[i]);
 
    printf("\nThe GIF LogicBlock is:\n");
    fread(LGC,sizeof(unsigned char),7,fp);
    for(i=0;i<7;i++)
    printf("%x\t",LGC[i]);
    printf("\n");

    printf("The Globle color Table is:\n");
    fread(GCT,sizeof(char),768,fp);
    for(i=0;i<768;i++)
    printf("%x\t",GCT[i]);
    printf("\n");

   
    printf("The Contrl Extension is:\n");
    fread(CrlE,sizeof(unsigned char),8,fp);
    for(i=0;i<8;i++)
    printf("%x\t",CrlE[i]);
    printf("\n");

   
    printf("The Image Descriptor is:\n");
    fread(ImgD,sizeof(unsigned char),10,fp);
    for(i=0;i<10;i++)
    printf("%x\t",ImgD[i]);
    printf("\n");

    printf("The Table Based Image Date is:\n");
    fread(T_B_minicode,sizeof(unsigned char),10,fp);
    for(i=0;i<9;i++)
    printf("%x\t",T_B_minicode[i]);
    printf("\n");


    fclose(fp);        
   return 0;
}
搜索更多相关主题的帖子: gif 图像 数据 
2008-06-19 19:18
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
收藏
得分:0 
全局颜色表的大小不一定正好是256种颜色,需要自己读GIF文件头分析的。
建议好好看一下GIF格式的文档

2008-06-20 11:15
justwant
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2008-6-8
收藏
得分:0 
参看了网上各种资料,gif文件头定义为
gif87a或gif89a,共占6字节

紧接文件头的是“逻辑屏幕描述块”,固定位7字节:

逻辑屏幕的高 2字节
逻辑屏幕的宽 2字节
打包字节     1字节(8bit)
背景色索引   1字节
像素高宽比   1字节
其中,“中间的打包字节”的后三bit位(共8bit)表示全局色表的尺寸,
若为111,则全局色表应该是256色的吧?
我读的几个图像全是111,还是会出现上述情况,到底为什么呢?
2008-06-20 18:15
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
收藏
得分:0 
1,首先看全局色表标志位,如果有全局色表就读后三位,然后读全局色表;
2,局部色表定义格式跟全局一致
3,可能某些颜色在图像中没有出现,所以可以先解码看结果再说。

2008-06-20 20:06
justwant
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2008-6-8
收藏
得分:0 
还是不甚明白,前面两点还好理解。第3点,可以先解码再回头来看吗?解码完又怎么看呢?
按我的理解,解码应该是这样的顺序:
1.读文件头
2.读逻辑屏幕描述块
3.读全局色彩表 (若2中表明有,才读)
———————————————————(以上3块应该是按顺序排在最前面)
4.读图像描述块
5.读局部色彩块(若4中表明有,才读)
6.读表基数据(即待解码数据)
7.读图像扩展控制块(若有,则读)
8.读注释扩展块(若有,则读)
8.读纯文本扩展块(若有,则读)
9.读应用程序扩展块(若有,则读)
10.读文件结束块
--------------------------------(以上7-9有则读,出现顺序不限,但一般在前3块之后)

所以,应该是读完前3块才会读到后面的块,问题在于有的文件读前3块还出现问题
2008-06-20 20:32
快速回复:为什么有的gif图像只能读出一部分数据?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025728 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved