从C中读取GIF标题中的数据

时间:2013-02-10 23:56:10

标签: c header gif

任何GIF图像文件的前13个字节如下:

3 bytes - the ascii characters "GIF"
3 bytes - the version - either "87a" or "89a"
2 bytes - width in pixels
2 bytes - height in pixels
1 byte - packed fields
1 byte - background color index
1 byte - pixel aspect ratio

我可以通过使用某种代码来获取前六个字节,如:

int G = getchar();
int I = getchar();
int F = getchar();

等...为87a / 89a部分做同样的事情,所有这一切都得到前6个字节,为GIF87a提供ascii字符。

好吧,我无法弄清楚如何获取其他信息。我尝试使用相同的getchar();方法,但它不是我所期望的。假设我有一个350x350的GIF文件,因为宽度和高度各为2个字节,我使用getchar 2次,最后宽度为“94”和“1”,两个数字,因为有两个字节。但是,我如何使用这些信息来获得实际的10,宽度和高度?我尝试按位94和1,但后来意识到它返回0。

我想也许如果我能找到如何获得宽度和高度,我将能够自己访问其余的信息。

像素宽度和高度以小印度格式存储。

2 个答案:

答案 0 :(得分:3)

它就像任何其他数字一样,分为有限范围的部分。例如,请查看43。每个数字的范围都是有限的,从0到9.所以下一个数字是10的数字,然后是数百(10 * 10),依此类推。在这种情况下,值的范围可以是0到255,因此下一个数字是256的数量。

256 * 1 + 94 = 350

标准应指定字节顺序,即最重要的(称为 big endian )是否位于最不重要的位置(称为 little endian

Byte Order: Little-endian

答案 1 :(得分:1)

通常,为了读取压缩的比特流或图像数据,我们可以以读取二进制模式打开文件,读取数据并通过getBits功能对其进行解释。例如,请考虑下面的示例

fptr = fopen("myfile.gif", "rb");

// Read a word
fread(&cache, sizeof(unsigned char), 4, fptr);

//Read your width through getBits
width = getBits(cache, position, number_of_bits);

有关getBits的更多详情,请参阅此处K & R Question: Need help understanding "getbits()" method in Chapter 2