В C # как определить, является ли изображение (jpg, gif или png) чересстрочным (не прогрессивным) или не чересстрочным (прогрессивным)? - PullRequest
4 голосов
/ 08 октября 2009

Как мне это сделать в C #? Я просмотрел всю сеть, но не смог найти ответ.

1 Ответ

6 голосов
/ 08 октября 2009

Согласно спецификации GIF поток байтов изображения GIF начинается с 6 байтов для заголовка и 7 байтов для «дескриптора логического экрана».

5-й байт дескриптора логического экрана является байтом «упакованных полей». Первый бит «упакованных полей» устанавливается, если изображение содержит глобальную таблицу цветов. Последние три бита - это число X, которое вы можете использовать для расчета размера глобальной таблицы цветов как 3 x 2^(X+1).

Затем следует глобальная таблица цветов (если она есть). Чтобы пропустить это, вам нужно знать его размер, рассчитанный как показано выше.

Затем следует 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, если вы прочитаете эти спецификации.

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