如何在 vc++ 6.0 和 vc++ 2005 中获得 GIF Transparency 颜色?
问问题
453 次
2 回答
1
请参阅GIF 规范。GIF 有多达 256 种可能颜色的调色板。背景颜色的调色板索引位于文件开头的偏移量 11 处,由一个字节组成(值 0-255)。要找到它对应的实际颜色,请在全局颜色表中查找该颜色。有关如何解析全局颜色表的更多信息,请参阅规范。
于 2008-12-04T06:43:52.153 回答
0
我刚刚实现了 GIF 解码器。以下是详细信息 - 万一
if(Graphics_Render_Block->transperencyflag) FrameInfo->transperencyindex=Graph_Renderblk.Transp_Clr_Index; 否则 FrameInfo->transperencyindex='\0';
逻辑很简单。在渲染到显示器上时,如果 transperencyindex == 该点的颜色,则不要渲染它。在面对,移动到下一个位置。
这是我的显示代码片段——我使用的是 Linux Framebuffer,但该逻辑也适用于 Microsoft VC。注意,这里我忽略了逻辑屏幕描述符。
void Display(FrameData *FrameInfo)
{
/*short int ImageStartX = 0;
short int ImageStartY = 0; */
unsigned int ImageStartX = 0;
unsigned int ImageStartY = 0;
int Index = 0;
printf("\r\n INFO: Display Called.\r\n");
while(1)
{
Index = 0;
ImageStartX = (FrameInfo->frameScreenInfo.LeftPosition);
ImageStartY = (FrameInfo->frameScreenInfo.TopPosition);
while(ImageStartY < ((FrameInfo->frameScreenInfo.ImageHeight)+(FrameInfo->frameScreenInfo.TopPosition)))
{
while(ImageStartX < ((FrameInfo->frameScreenInfo.ImageWidth)+(FrameInfo->frameScreenInfo.LeftPosition)))
{
if(FrameInfo->frame[Index] != FrameInfo->transperencyindex)
{
#ifndef __DISPLAY_DISABLE
SetPixel(local_display_mem,ImageStartX,ImageStartY,((FrameInfo->CMAP)+(FrameInfo->frame[Index]))->Red,((FrameInfo->CMAP)+(FrameInfo->frame[Index]))->Green,((FrameInfo->CMAP)+(FrameInfo->frame[Index]))->Blue);
#endif
#ifdef DEBUG
count++;
#endif
}
Index++;
ImageStartX++;
}
ImageStartY++;
ImageStartX=(FrameInfo->frameScreenInfo.LeftPosition);
}
#ifdef DEBUG
printf("INFO:..Dumping Framebuffer\r\n");
printf("Pixel hit=%d\r\n",count);
count = 0;
printf("the Frameinfo.leftposition=%d FrameInfo->frameScreenInfo.topposition=%d\r\n",FrameInfo->frameScreenInfo.LeftPosition,FrameInfo->frameScreenInfo.TopPosition);
printf("the Frameinfo.ImageWidth=%d FrameInfo->frameScreenInfo.ImageHeight=%d\r\n",FrameInfo->frameScreenInfo.ImageWidth,FrameInfo->frameScreenInfo.ImageHeight);
#endif
#ifndef __DISPLAY_DISABLE
memcpy(fbp,local_display_mem,screensize);
#endif
/** Tune this multiplication to meet the right output on the display **/
usleep((FrameInfo->InterFrameDelay)*10000);
if( FrameInfo->DisposalMethod == 2)
{
printf("set the Background\r\n");
#ifndef __DISPLAY_DISABLE
SetBackground(FrameInfo);
#endif
}
FrameInfo = FrameInfo->Next;
}
}
我使用的设计是解码所有帧,并制作一个单循环链接列表。现在,继续显示帧。您可以从以下链接下载解码器逻辑和详细信息 - http://www.tune2wizard.com/gif-decoder/
于 2014-04-10T11:24:21.863 回答