任何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。
我想也许如果我能找到如何获得宽度和高度,我将能够自己访问其余的信息。
像素宽度和高度以小印度格式存储。
答案 0 :(得分:3)
它就像任何其他数字一样,分为有限范围的部分。例如,请查看43
。每个数字的范围都是有限的,从0到9.所以下一个数字是10的数字,然后是数百(10 * 10),依此类推。在这种情况下,值的范围可以是0到255,因此下一个数字是256的数量。
256 * 1 + 94 = 350
标准应指定字节顺序,即最重要的(称为 big endian )是否位于最不重要的位置(称为 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