0

任何 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。

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

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

4

2 回答 2

3

It's just like any other number broken into parts with a limited range. For example, look at 43. Each digit has a limited range, from 0 to 9. So the next digit is the number of 10's, then hundreds (10*10) and so on. In this case, the values can range from 0 to 255, so the next number is the number of 256's.

256 * 1 + 94 = 350

The standard should specify the byte order, that is, whether the most significant (called big endian) comes first of the least significant (called little endian) comes first.

Byte Order: Little-endian

于 2013-02-11T00:03:43.560 回答
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);

请参阅此处K & R 问题:需要帮助理解第 2 章中的“getbits()”方法以获取有关 getBits 的更多详细信息

于 2013-02-11T00:10:21.523 回答