VC ++ 6.0 및 VC ++ 2005에서 GIF 투명성 색상을 얻는 방법

StackOverflow https://stackoverflow.com/questions/339722

  •  19-08-2019
  •  | 
  •  

문제

VC ++ 6.0 및 VC ++ 2005에서 GIF 투명성 색상을 얻는 방법은 무엇입니까?

도움이 되었습니까?

해결책

참조 GIF 사양. GIF에는 최대 256 개의 가능한 색상의 팔레트가 있습니다. 배경색의 팔레트 색인은 파일의 시작부터 오프셋 11에서 찾을 수 있으며 단일 바이트 (값 0-255)로 구성됩니다. 이것이 해당하는 실제 색상을 찾으려면 글로벌 컬러 테이블에서 해당 색상을 찾으십시오. 글로벌 컬러 테이블을 구문 분석하는 방법에 대한 자세한 내용은 사양을 참조하십시오.

다른 팁

방금 GIF 디코더를 구현했습니다. 다음은 세부 사항입니다

if (graphics_render_block-> transperencyflag) frameInfo-> transperencyIndex = Graph_renderBlk.transp_clr_index; else 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/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top