📄 gif.h
字号:
#ifndef _GIF_PICTURE_
#define _GIF_PICTURE_
//GIF的LZW算法的编译表
//串表最大12位,即4096字节,初始化到索引"色深+2"字节,内容为0~色深+1
// 每个string可以形成一棵二叉树, 此二叉树仅有一个右节点
// 因为wPrefix总是指向String Table中的另一位置, 而wSuffix指向"0~色深-1"
struct LZW_COMPILE_TABLE
{
WORD wPrefix ; // 为 Old
WORD wSuffix ; // 为 GetFirstChar (Old) 或 GetFirstChar (Code)
};
struct GIF_HEADER //GIF文件头
{
BYTE bySignature[3]; //署名,
BYTE byVersion[3]; //版本号,"87a"表1987年5月版本,"89a"表1989年7月版本
};
struct GIF_SCREEN //逻辑屏幕标识符
{
WORD wScreenWidth; //逻辑屏幕宽度
WORD wScreenHeight; //逻辑屏幕高度
struct flag
{
BYTE pixel:3; //全局颜色列表大小,pixel+1确定颜色列表的索引数(2的pixel+1次方).
BYTE s:1; //分类标志(Sort Flag),如果置位表示全局颜色列表分类排列.
BYTE cr:3; //颜色深度(Color ResoluTion),cr+1确定图象的颜色深度.
BYTE m:1; //全局颜色列表标志(Global Color Table Flag)。
}Flag;
BYTE byBackgroundColor; //前景色
BYTE byAspectRatio; //像素宽高比
};
struct GIF_RGBQUAD
{
BYTE byRed;
BYTE byGreen;
BYTE byBlue;
};
/*一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,
图象标识符以0x2C(',')字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑
屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成。
GIF图象数据使用了LZW压缩算法,大大减小了图象数据的大小。图象数据在压缩前有两种
排列格式:连续的和交织的(由图象标识符的交织标志控制)。连续方式按从左到右、从上
到下的顺序排列图象的光栅数据;交织图象按下面的方法处理光栅数据:
创建四个通道(pass)保存数据,每个通道提取不同行的数据:
第一通道(Pass 1)提取从第0行开始每隔8行的数据;
第二通道(Pass 2)提取从第4行开始每隔8行的数据;
第三通道(Pass 3)提取从第2行开始每隔4行的数据;
第四通道(Pass 4)提取从第1行开始每隔2行的数据;
*/
struct GIF_ENTRY //图像标识符
{
BYTE byFlags; //图象标识符开始标志,恒定于0x2C
WORD wImageLeft ; // 图象相对于逻辑屏幕左上角的x坐标,常为0;
WORD wImageTop ; // 图象相对于逻辑屏幕左上角的y坐标,常为0
WORD wImageWidth ;// 图象的宽度
WORD wImageHeight ;// 图象的高度
struct flag
{
BYTE pixel:3; //局部颜色列表大小,pixel+1就为颜色列表的位数
BYTE r:2; //保留,必须初始化为0.
BYTE s:1; //分类标志,如果置位表示紧跟着的局部颜色列表分类排列.
BYTE i:1; //交织标志,置位时图象数据使用连续方式排列,否则使用顺序排列。
BYTE m:1; //局部颜色列表标志。
}Flag;
};
/*这一部分是可选的(需要89a版本),可以放在一个图象块(包括图象标识符、局部颜色列表
和图象数据)或文本扩展块的前面,用来控制跟在它后面的第一个图象(或文本)的渲
染(Render)形式。
*/
struct GIF_CONTROL_EX //图形控制扩展块
{
BYTE byFlags1; //扩展块,恒定于0x21
BYTE byFlags2; //图形控制扩展块,恒定于0xF9
BYTE bySize; //不包括块终结器,固定值4
struct flag
{
WORD t:2; //透明色标志,置位表示使用透明颜色
WORD i:2; //用户输入标志
//指出是否期待用户有输入之后才继续进行下去,置位表示期待,值否
//表示不期待。用户输入可以是按回车键、鼠标点击等,可以和延迟
//时间一起使用,在设置的延迟时间内用户有输入则马上继续进行,或
//者没有输入直到延迟时间到达而继续。
WORD method:8; //处置方法
//0 - 不使用处置方法
//1 - 不处置图形,把图形从当前位置移去
//2 - 回复到背景色
//3 - 回复到先前状态
//4-7 - 自定义
WORD reserved:4; //保留
}Flag;
BYTE byDelayTime; //单位1/100秒,如果值不为1,表示
//暂停规定的时间后再继续往下处理数据流
BYTE byTransparentIndex; //透明色索引值
BYTE byTerminator; //标识块终结,固定值0
};
/*这一部分是可选的(需要89a版本),可以用来记录图形、版权、
描述等任何的非图形和控制的纯文本数据(7-bit ASCII字符),
注释扩展并不影响对图象数据流的处理,解码器完全可以忽略它。
存放位置可以是数据流的任何地方,最好不要妨碍控制和数据块,
推荐放在数据流的开始或结尾。
*/
struct GIF_COMMENT_EX //注释扩展块
{
BYTE byFlags1; //扩展块,恒定于0x21
BYTE byFlags2; //图形控制扩展块,恒定于0xFE
// + 多个 Comment Data
// + Terminator - 标识块终结,固定值0
};
/*这一部分是可选的(需要89a版本),用来绘制一个简单的文本图象,
这一部分由用来绘制的纯文本数据(7-bit ASCII字符)和控制绘制的
参数等组成。绘制文本借助于一个文本框(Text Grid)来定义边界,
在文本框中划分多个单元格,每个字符占用一个单元,绘制时按从左到右、
从上到下的顺序依次进行,直到最后一个字符或者占满整个文本框(之后的
字符将被忽略,因此定义文本框的大小时应该注意到是否可以容纳整个文本),
绘制文本的颜色使用全局颜色列表,没有则可以使用一个已经保存的前一个
颜色列表。另外,图形文本扩展块也属于图形块(Graphic Rendering Block),
可以在它前面定义图形控制扩展对它的表现形式进一步修改。
*/
struct GIF_TEXT_EX //图形文本扩展块
{
BYTE byFlags1; //扩展块,恒定于0x21
BYTE byFlags2; //图形文本控制扩展块,恒定于0x01
BYTE bySize; //块大小,固定值12
WORD wTextLeft; //文本框离逻辑屏幕的左边界距离
WORD wTextTop; //文本框离逻辑屏幕的上边界距离
WORD wTextWidth;//文本框宽度
WORD wTextHeight;//文本框高度
BYTE byCellWidth;//单个单元格宽度
BYTE byCellHeight;//单个单元格宽度
BYTE byForegroundIndex;//前景色在全局颜色列表中的索引
BYTE byBlackgroundIndex;//背景色在全局颜色列表中的索引
// + 多个 Text Data
// + Terminator - 标识块终结,固定值0
};
/*这是提供给应用程序自己使用的(需要89a版本),应用程序可以在这里定义
自己的标识、信息等。
*/
struct GIF_APPLICATION_EX
{
BYTE byFlags1; //扩展块,恒定于0x21
BYTE byFlags2; //应用程序扩展块,固定值0xFF
BYTE bySize; //块大小,固定值11
BYTE byIdentify[8];//应用程序标识符
BYTE byAuthenticationCode[3];//应用程序鉴别码
// + 多个 Data
// + Terminator - 标识块终结,固定值0
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -