2010-03-20 14 views
6

Görüntü dosyalarından ham veri akışı aldım, örneğin:Ham dosya akışı meta verilerinin endian-duyarlı okuma için C++ kütüphanesi?

vector<char> rawData(fileSize); 
ifstream inFile("image.jpg"); 
inFile.read(&rawData[0]); 

Yükseklik ve genişlik için farklı görüntü formatlarının başlıklarını ayrıştırmak istiyorum. Tampon/akıştan ints, longs, shorts, vb. Okuyabildiği, endianess'i belirtilen şekilde değiştirebilen portatif bir kütüphane var mı?

short x = rawData.readLeShort(offset); veya long y = rawData.readBeLong(offset)

Daha da iyi bir seçenek bile işe yarayabilecek bir & taşınabilir görüntü meta veri kütüphanesi (görüntü manipülasyon kütüphanesinin ekstra ağırlığı olmadan) olurdu ham görüntü verilerinde. Orada Exif kütüphanelerinin png ve gif'yi desteklemediğini buldum.

cevap

0

Kendinizi yapmak zor değil.

unsigned char buffer[4]; 
inFile.read(buffer, sizeof(buffer)); 

unsigned int number = buffer[0] + 
         (buffer[1] << 8) + 
         (buffer[2] << 16) + 
         (buffer[3] << 24); 

ve büyük endian 32 bit sayısını okumak için: Burada biraz endian 32 bit numarasını okuyabilir nasıl ben genelleştirilmiş

unsigned char buffer[4]; 
inFile.read(buffer, sizeof(buffer)); 

unsigned int number = buffer[3] + 
         (buffer[2] << 8) + 
         (buffer[1] << 16) + 
         (buffer[0] << 24); 
+0

bu kadar: 'şablon T Magic :: getLE (const char * data) const {T değeri = 0; int bayt = sizeof (T); (int i = 0; i Kache

+0

Aslında, yukarıdaki kodda bir hata var. Karakterleri bir defada değiştirmek yerine, bir seferde T 'yi değiştirir. Bunu düzeltir: 'template T Magic :: getLE (const char * data) const {T değeri = 0; int bayt = sizeof (T); imzasız char c; için (int i = 0; i Kache