2017-10-10 39 views
0

我正在尝试编写一个简单的TGA-Loader,并且发现读取某些图像后,某些点会产生大量不需要的空值。 我要测试的图像有六个:它们每个都有32x32像素的BGR颜色。 现在四个图像读取正常,而其余两个只读直到第17个字节。从那里,它们由空值,它看起来像:阅读TGA显示空值而不是颜色数据

0:220 164 55
1:232 173 57
2:241 177 51
...
16:252 181 41
17:249 180 41
18:0 0 0
19:0 0 0

ifstream myFile(filePath); 

// Read Header 

struct tgaHeader *header = new struct tgaHeader; 

myFile.read((char *) &header->imageIDlength, 1); 
myFile.read((char *) &header->colormapType, 1); 
myFile.read((char *) &header->imageType, 1); 

myFile.read((char *) &header->colormapBegin, 2); 
myFile.read((char *) &header->colormapLength, 2); 

myFile.read((char *) &header->sizeOfEntryInPallette, 1); 

myFile.read((char *) &header->xOrigin, 2); 
myFile.read((char *) &header->yOrigin, 2); 
myFile.read((char *) &header->width, 2); 
myFile.read((char *) &header->height, 2); 

myFile.read((char *) &header->bitsPerPoint, 1); 
myFile.read((char *) &header->attributeByte, 1); 

// Test if Format is supported 

if(header->imageIDlength != 0 || 
    header->colormapType != 0 || header->colormapBegin != 0 || header->colormapLength != 0 || 
    header->imageType != 2  || header->xOrigin != 0  || header->yOrigin != 0  || 
    !(header->bitsPerPoint == 24 || header->bitsPerPoint == 32)) 
{ 
    myFile.close(); 
    throw runtime_error("image format is not supported"); 
} 

// Since only TGA-files with no Image-ID and no Colormap are supported, 
// here immediatly the image data can be read. 

uint16_t bytesPerPoint = header->bitsPerPoint/8; 
unsigned long long imSize = static_cast<long long> (header->width) * header->height * bytesPerPoint; 

vector<uint8_t> * pixels = new vector<uint8_t> (imSize); 
myFile.read((char *) pixels->data(), imSize); 

unsigned long long i; 
for(i=0; i < imSize; i+=3) { 

    uint8_t t0 = pixels->at(i+0);  // swap from BGR to RGB 
    uint8_t t1 = pixels->at(i+1); 
    uint8_t t2 = pixels->at(i+2); 

    (*pixels)[i+0] = t2; 
    (*pixels)[i+1] = t1; 
    (*pixels)[i+2] = t0; 

} 

// Further Meta-Data following the image data are ignored. 

myFile.close(); 

return pixels; 

TgaHeader是定义的结构,它包含uint8_t和uint16_t字段。 为了清晰起见,我已经移除了异常处理,但在读取数据时从未发现任何错误。 IrfanView和Gimp能够打开有问题的图像,并在二进制查看器中找不到空值。我只选择了没有Image-ID且没有色彩映射和等效标题的图像,所以这也不应该成为问题。
那么为什么这些空值呢?

+0

也许图像从该点只是黑色的。可能由于某些原因,文件被截断或损坏。你似乎没有检查是否有任何'read()'实际上成功了。 – kolrabi

+0

我已经检查过'read()'是否确实在做他们的工作,并且一切看起来都很好。 –

回答

0

最后我发现这个问题:由于原因,我看不到ifstream的位置跳到ca. 450.即使标题信息位于前18个字节,也可以从标题中读取标题。 在阅读我简单地设置ifstream的位置,该点的头之后的结果是颜色数据开始:

vector<uint8_t> * imRawData = new vector<uint8_t> (imSize); 

myFile->seekg(ios_base::beg + 18); 
myFile->read((char *) imRawData->data(), imSize);