как получить цвет прозрачности GIF в vc ++ 6.0 и vc ++ 2005 - PullRequest
2 голосов
/ 04 декабря 2008

как получить цвет прозрачности GIF в vc ++ 6.0 и vc ++ 2005?

Ответы [ 2 ]

1 голос
/ 04 декабря 2008

См. Спецификацию GIF . GIF-файлы имеют палитру до 256 возможных цветов. Индекс палитры цвета фона можно найти по смещению 11 от начала файла и состоит из одного байта (значение 0-255). Чтобы найти фактический цвет, которому он соответствует, найдите этот цвет в Глобальной таблице цветов. См. Спецификацию для получения дополнительной информации о том, как анализировать Глобальную таблицу цветов.

0 голосов
/ 10 апреля 2014

Я только что реализовал GIF-декодер. Вот подробности - В случае, если

если (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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...