Я пытаюсь прочитать заголовок 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.
Это проблема заполнения. С 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
Других решений пока нет …