如何在vc ++ 6.0和vc ++ 2005中获得GIF透明度颜色

时间:2008-12-04 06:31:06

标签: gif

如何在vc ++ 6.0和vc ++ 2005中获得GIF透明度颜色?

2 个答案:

答案 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/