Данные изображения из файла PCX

У меня есть большой двоичный файл с большим количеством файлов, хранящихся в нем. Я пытаюсь скопировать данные изображения PCX из файла и записать его в новый файл, который затем можно открыть в редакторе изображений.

После получения спецификаций для заголовка файла PCX я думаю, что я поместил изображение в большой двоичный файл. Моя проблема в том, что я не могу понять, сколько байтов я должен прочитать после заголовка. Я читал о декодировании файлов PCX, но не хочу ничего декодировать. Я хочу прочитать закодированные данные изображения и записать их в отдельный файл, чтобы можно было открыть редактор изображений.

Вот заголовок. Я включил значения изображения, так как я думаю, что они могут быть использованы для определения "конца файла" для данных изображения.

struct PcxHeader
{
BYTE Identifier;        // PCX Id Number (Always 0x0A) // 10  
BYTE Version;           // Version Number    // 5  
BYTE Encoding;          // Encoding Format    // 1  
BYTE BitsPerPixel;      // Bits per Pixel    // 8  
WORD XStart;            // Left of image     // 0  
WORD YStart;            // Top of Image     // 0  
WORD XEnd;              // Right of Image    // 319  
WORD YEnd;              // Bottom of image    // 199  
WORD HorzRes;           // Horizontal Resolution   // 320  
WORD VertRes;           // Vertical Resolution   // 200  
BYTE Palette[48];       // 16-Color EGA Palette    
BYTE Reserved1;         // Reserved (Always 0)  
BYTE NumBitPlanes;      // Number of Bit Planes   // 1  
WORD BytesPerLine;      // Bytes per Scan-line   // 320  
WORD PaletteType;       // Palette Type     // 0  
WORD HorzScreenSize;    // Horizontal Screen Size   // 0  
WORD VertScreenSize;    // Vertical Screen Size   // 0  
BYTE Reserved2[54];     // Reserved (Always 0)
};

2 ответа

Существует три компонента формата файла PCX:

  • 128-байтовый заголовок (хотя на самом деле используется меньше, он длиной 128 байт)
  • данные изображения переменной длины
  • необязательная 256 цветовая палитра (хотя существуют неподходящие файлы PCX с размерами палитры, отличными от 256 цветов).

Из статьи Википедии:

Из-за схемы сжатия PCX единственный способ определить фактическую длину данных изображения - это прочитать и обработать их. Это усилие затруднено, потому что формат позволяет сжатым данным выходить за пределы размеров изображения, часто дополняя их до следующих 8 или 16 строк.

В общем, похоже, что вам придется выполнить "глубокую обработку" данных изображения, чтобы найти полный файл PCX, встроенный в ваш больший двоичный файл.

Не зная много о формате файлов PCX, я могу предположить следующее:

 bytesAfterHeader = header.BytesPerLine * header.VertRes;
Другие вопросы по тегам