如何在vc ++ 6.0和vc ++ 2005中获得GIF透明度颜色?
答案 0 :(得分:1)
请参阅GIF specification。 GIF具有多达256种可能颜色的调色板。背景颜色的调色板索引可以在距文件开头的偏移11处找到,并且由单个字节(值0-255)组成。要查找与其对应的实际颜色,请在全局颜色表中查找该颜色。有关如何解析全局颜色表的详细信息,请参阅规范。
答案 1 :(得分:0)
我刚刚实现了GIF解码器。这是详细信息 - 如果是
如果(Graphics_Render_Block-> transperencyflag) FrameInfo-> transperencyindex = Graph_Renderblk.Transp_Clr_Index; 其他 FrameInfo-> transperencyindex =' \ 0&#39 ;;
逻辑很简单。在渲染到显示器时,如果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/