VC ++ 6.0 및 VC ++ 2005에서 GIF 투명성 색상을 얻는 방법
-
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/