2015-04-26 2 views
2

Я пытаюсь получить информацию из файла изображения tiff. Результат Endian правильный, но все остальные ошибочны. Первые 8 байт файла TIFF является:Чтение tiff изображения с C++

4d 4d 00 2a 00 02 03 60 

magicno Я получаю 10752, который 2a00 является HEX. Но я должен читать третий и для байтов, который должен быть 002a. Нужна помощь, пожалуйста!

Вот мой код.

#include <iostream> 
#include <fstream> 


using namespace std; 

int main() 
{ 
    char buffer[3]; 

    short magicno; 
    int ifdaddress; 
    short ifdcount; 


    ifstream imfile; 
    imfile.open("pooh.tif",ios::binary); 

    imfile.seekg(0,ios::beg); 

    imfile.read(buffer,2); 
    imfile.read((char*)&magicno, 2); 
    imfile.read((char*)&ifdaddress, 4); 

    imfile.seekg(ifdaddress, ios::beg); 
    imfile.read((char*)&ifdcount, 2); 

    imfile.close(); 

    buffer[2]='\0'; 


    cout<<"Endian: "<<buffer<<endl; 
    cout<<"Magic: "<<magicno<<endl; 
    cout<<"IFD Address: "<<ifdaddress<<endl; 
    cout<<"IFD CountL "<<ifdcount<<endl; 

    return 0; 

} 

Мой вывод:

Endian: MM 
Magic: 10752 
IFD Address: 1610809856 
IFD CountL 0 

ответ

1

Вы правильно прочитать маркер порядка байтов, но вы не акт на него. От компании Adobe "TIFF 6":

Байт 0-1:
порядок байт используется в файле. Допустимые значения:
«II» (4949.H)
«ММ» (4D4D.H)
В формате «II», порядок байт всегда от младшего байта самый старший байт, как для 16-битные и 32-битные целые числа. Это называется порядком байтового байта. В формате «ММ» порядок байтов всегда от самого значимого до наименее значимого, как для 16-битных, так и для 32-битных целых чисел. Это называется порядком байтового байта.
(https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf)

Вам необходимы два набора подпрограмм, чтобы прочитать короткое целое число из файла TIFF (а также читать больше интегральные тип): один, который читает Motorola («ММ») число тупоконечника , и тот, который читает Intel («II») малоконтинента.

Как бы то ни было, вы должны быть одной системой с маленькими концами, в то время как для чтения изначально читаемых чисел с большими номерами.

Код правильно читать слово может быть столь же просто, как

unsigned char d1,d2; 
imfile.read (&d1,1); 
imfile.read (&d2,1); 
if (magicno == 0x4949) 
    word = d1 + (d2<<8); 
else 
    word = (d1<<8)+d2; 

непроверенными, но общая идея должна быть ясна. Лучше сделать его функцией, потому что вам нужна аналогичная настройка для типа данных «LONG», которая, в свою очередь, необходима для типа данных «RATIONAL».

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

+0

Большое вам спасибо! Теперь я знаю, в чем моя проблема. У меня есть еще один вопрос. Если то, что я прочитал из файла tiff, является шестнадцатеричным, почему я печатаю десятичные числа? – user2817869

+0

Также, пожалуйста, объясните мне строку word = d1 + (d2 << 8)? Я не совсем понимаю часть d2 << 8. Спасибо – user2817869

+1

@ user2817869 << является одним из побитовых операторов. Вы захотите узнать о них подробно, если вы пишете такой код. Одно место для начала: http://www.cprogramming.com/tutorial/bitwise_operators.html – Ixrec