У меня есть этот код:
ifstream istream;
std::string line;
TIFHEAD header;
istream.open("pic.tif",ios::binary|ios::in);
istream.read((char*)&header, sizeof(TIFHEAD));
cout<<hex<<header.Identifier<<" "<<header.Version<<" "<<header.IFDOffset<<endl<<endl;
istream.seekg(header.IFDOffset);
WORD numEntries1;
istream.read((char *)&numEntries1, sizeof(WORD));
cout<<numEntries1<<endl;
DWORD tagOffset;
DWORD stripByte;
for(int i=0; i<numEntries1; i++) {
TIFTAG tag;
istream.read((char *)&tag, sizeof(TIFTAG));
cout<<istream.tellg()<<":"<<tag.TagId<<" "<<tag.DataType<<" "<<tag.DataCount<<" "<<tag.DataOffset<<endl;
}
Я также сделал hexdump на pic.tif и получил около 450 строк шестнадцатеричных значений, многие из которых были отражены в данных тега и заголовке, который я печатаю.
Но я обнаружил, что этот TIFF имеет сжатие 32946, которое является COMPRESSION_DEFLATE.
Как я могу распаковать другие шестнадцатеричные значения из hexdump, чтобы получить фактические значения с плавающей точкой из этого TIFF? Я знаю, что Zlib может распаковывать, но может ли он распаковывать сжатие при сжатии, и если да, то как?
Я знаю, что значения с плавающей точкой должны быть через LibTIFF, но я не могу это использовать. Это 32-битный формат 512×512, который имеет значения с плавающей точкой.
Кроме того, я могу опубликовать дополнительную информацию о TIFF или значениях из hexdump, если кто-то захочет его увидеть.
Каждый сегмент представляет собой стандартный поток zlib, то есть данные, сжатые методом дефляции, с заголовком zlib и трейлером. Вы можете использовать Zlib’s uncompress()
или же inflateInit()
/ inflate()
/ inflateEnd()
функции.
Других решений пока нет …