64,281
社区成员
发帖
与我相关
我的任务
分享
// pBitmapFrameDecode 是一个 IWICBitmapFrameDecode
hr = pBitmapFrameDecode->GetMetadataQueryReader(&pFrameMetadataQueryReader);
if (hr == WINCODEC_ERR_UNSUPPORTEDOPERATION && I == 0) MessageBox(NULL, "WINCODEC_ERR_UNSUPPORTEDOPERATION", "Error!", MB_OK); // I == 0 是第一帧
bool GIF_Get_Frame_Data (PBYTE buffer, int buffer_count)
{
// freopen("Get_Frame_Debug.txt", "w+", stdout);
int i = 10; // 舍弃前 10 Bytes
bool Global_Color_TableFlag = buffer[i] >> 7; // 全局颜色列表标志
int Global_Pixel_Index_Count = Global_Color_TableFlag ? 2 << (buffer[i] % 8) : 0; // 全局颜色列表索引数
i += 3 + Global_Pixel_Index_Count * 3; // 跳过这 1 Byte 和接下来的 2 Bytes 并且如果有,跳过全局色表
while (i < buffer_count)
{
int cnt;
switch (buffer [i++])
{
case 0x21:
{
switch (buffer [i++])
{
case 0xfe: // 注解块
case 0x01: // 普通文本块
case 0xff: // 应用程序块
while (cnt = buffer [i++])
i += cnt;
break;
case 0xf9: // 图形控制扩展块
{
static int Frame_Index = 0; // 第 n 帧
printf("\nFrame - %d:\n", Frame_Index++);
i += 2;
int Frame_Delay = ((buffer [i+1] << 8) | buffer [i]) * 10; i+=4; // 帧延迟时间 (单位:ms)
printf(" Frame_Delay: %d\n", Frame_Delay);
break;
}
default:
printf("Bad Format!\n");
break;
}
break;
}
case 0x2c: // 图象标识符
{
// 读取元数据并输出
int Frame_X_Offset = (buffer [i+1] << 8) | buffer [i]; i+=2; // X 轴偏移量
int Frame_Y_Offset = (buffer [i+1] << 8) | buffer [i]; i+=2; // Y 轴偏移量
int Frame_Width = (buffer [i+1] << 8) | buffer [i]; i+=2; // 帧宽度
int Frame_Height = (buffer [i+1] << 8) | buffer [i]; i+=2; // 帧高度
printf (" Frame_Width: %d\n", Frame_Width);
printf (" Frame_Height: %d\n", Frame_Height);
printf (" X_Offset: %d\n", Frame_X_Offset);
printf (" Y_Offset: %d\n", Frame_Y_Offset);
bool Local_Color_TableFlag = buffer[i] >> 7; // 局部颜色列表标志
int Local_Pixel_Index_Count = Local_Color_TableFlag ? 2 << (buffer[i] % 8) : 0; // 局部颜色列表索引数
i += 1 + Local_Pixel_Index_Count * 3; // 跳过这 1 Byte 并且如果有,跳过局部色表
// LZW
int LZW_Min_Code_Size = buffer [i++]; // 读取 LZW 编码初始码表大小的位数
while(cnt = buffer[i++]) // 跳过子块
i+= cnt;
break;
}
case 0x3b:
{
printf("\nDecode End!\n");
break;
}
default:
{
printf("Unkown Type: %d: %u\n", i, buffer[i - 1]);
break;
}
}
}
// fclose(stdout);
return true;
}
这样的话也就能满足我的需求了,目前看来这应该是唯一的替代方法了吧……我觉得后来人应该不会去探究这个问题了,现在连win7都停止支持了,估计没几个人会继续用着XP吧……