2009-10-08 3 views

답변

6

GIF spec에 따르면 gif 이미지의 바이트 스트림은 헤더의 경우 6 바이트로 시작하고 "논리적 화면 설명자"의 경우 7 바이트로 시작합니다.

논리 화면 설명자의 다섯 번째 바이트는 "묶음 필드"바이트입니다. 이미지에 전역 색상 표가 포함 된 경우 "묶음 필드"의 첫 번째 비트가 설정됩니다. 마지막 세 비트는 전체 색상 표의 크기를 3 x 2^(X+1)으로 계산하는 데 사용할 수있는 숫자 X입니다.

그런 다음 전역 색상 표 (있는 경우)를 따릅니다. 이 부분을 건너 뛰려면 위와 같이 계산하여 크기를 알아야합니다.

그런 다음 10 바이트 "이미지 설명자"를 따릅니다. 마지막 바이트는 또 다른 "압축 된 필드"입니다. 이미지가 인터레이스 된 경우 해당 바이트의 두 번째 비트가 설정됩니다.

public bool IsInterlacedGif(Stream stream) 
    { 
    byte[] buffer = new byte[10]; 
    int read; 

    // read header 
    // TODO: check that it starts with GIF, known version, 6 bytes read 
    read = stream.Read(buffer, 0, 6); 

    // read logical screen descriptor 
    // TODO: check that 7 bytes were read 
    read = stream.Read(buffer, 0, 7); 
    byte packed1 = buffer[4]; 
    bool hasGlobalColorTable = ((packed1 & 0x80) != 0); // extract 1st bit 

    // skip over global color table 
    if (hasGlobalColorTable) 
    { 
     byte x = (byte)(packed1 & 0x07); // extract 3 last bits 
     int globalColorTableSize = 3 * 1 << (x + 1); 
     stream.Seek(globalColorTableSize, SeekOrigin.Current); 
    } 

    // read image descriptor 
    // TODO: check that 10 bytes were read 
    read = stream.Read(buffer, 0, 10); 
    byte packed2 = buffer[9]; 
    return ((packed2 & 0x40) != 0); // extract second bit 
    } 

당신이 그 사양을 읽으면 바이트 스트림의 유사한 검사, JPG 및 PNG를 위해 할 수있는 의심의 여지가.

관련 문제