2009-10-08 7 views

Répondre

6

Selon le GIF spec, le flux d'octets d'une image gif commence avec 6 octets pour l'en-tête et 7 octets pour le "descripteur d'écran logique".

Le 5ème octet du descripteur d'écran logique est un octet "packed fields". Le premier bit des "champs compressés" est défini si l'image contient une table de couleurs globale. Les trois derniers bits sont un nombre X que vous pouvez utiliser pour calculer la taille de la table de couleurs globale en tant que 3 x 2^(X+1).

Puis suit la table de couleurs globale (si elle est présente). Pour éviter cela, vous devez connaître sa taille, calculée comme indiqué ci-dessus. Puis suit un "descripteur d'image" de 10 octets. Le dernier octet de ceux-ci est un autre "champs emballés". Le deuxième bit de cet octet est défini si l'image est entrelacée.

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 
    } 

Sans doute une inspection similaire du flux d'octets peut être fait pour JPG et PNG, si vous lisez ces spécifications.

Questions connexes