Данные изображения из файла 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;