Неправильный заголовок файла TGA в Windows

Я пытаюсь прочитать заголовок TGA файла, который я создал в Paint.net. Кажется, что-то не так с этим. Если я использую структуру заголовка из спецификации, как этот:

typedef struct {
CHAR  idlength;
CHAR  colourmaptype;
CHAR  datatypecode;
WORD colourmaporigin;
WORD colourmaplength;
CHAR  colourmapdepth;
WORD x_origin;
WORD y_origin;
WORD width;
WORD height;
CHAR  bitsperpixel;
CHAR  imagedescriptor;
} TGAHEADER;

Я получаю это:

Data size: 0
Color Map type: 0
Data Type code: 2
Bits per-pixel: 0
Size: 501 x 2080

Что не так, так как мое изображение 501×501, 32 бита на пиксель. Однако, если я закомментирую два байта из структуры, т.е. этот colourmaporiginЯ получаю это:

Data size: 0
Color Map type: 0
Data Type code: 2
Bits per-pixel: 32
Size: 501 x 501

Что правильно. Я читал все, что я нашел в этом формате файла. Никогда не говорится, что любое из этих полей является необязательным или что-то в этом роде.

Почему я получаю такие результаты?

Вот код для чтения данных:

void Image::readTGA()
{
TGAHEADER fileHeader;

std::ifstream fileHandle(fileName, std::ios::binary);
if (fileHandle.is_open())
{
fileHandle.read((char*)(&fileHeader), sizeof(TGAHEADER));
fileHandle.close();
}
else
{
std::cout << "An error occured when opening a file." << std::endl;
}
}

Я использую VS2015, ориентируясь на платформу x86.

1

Решение

Это проблема заполнения. С Visual Studio вы можете использовать #pragma pack(1) Директива компилятора отключает любые дополнения структур.

демонстрация

#include<stdio.h>
#include<windows.h>

// Default packing of structure with padding

typedef struct {
CHAR  idlength;
CHAR  colourmaptype;
CHAR  datatypecode;
WORD colourmaporigin;
WORD colourmaplength;
CHAR  colourmapdepth;
WORD x_origin;
WORD y_origin;
WORD width;
WORD height;
CHAR  bitsperpixel;
CHAR  imagedescriptor;
} TGAHEADER;#pragma pack(1) // structure fields are aligned to byte boundary (no padding)

typedef struct {
CHAR  idlength;
CHAR  colourmaptype;
CHAR  datatypecode;
WORD colourmaporigin;
WORD colourmaplength;
CHAR  colourmapdepth;
WORD x_origin;
WORD y_origin;
WORD width;
WORD height;
CHAR  bitsperpixel;
CHAR  imagedescriptor;
} TGAHEADER_PACKED;

int main()
{
printf("Offset of field bitsperpixel in TGAHEADER structure %d\n", offsetof(TGAHEADER, bitsperpixel));
printf("Offset of field bitsperpixel in packed TGAHEADER structure %d\n", offsetof(TGAHEADER_PACKED, bitsperpixel));
}

Выход:

Offset of field bitsperpixel in TGAHEADER structure 18
Offset of field bitsperpixel in packed TGAHEADER structure 16
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]