读取TGA显示空值而不是颜色数据

时间:2017-10-10 09:32:43

标签: c++ image image-processing ifstream tga

我试图编写一个简单的TGA-Loader,我发现在某个点之后读取一些图像会产生大量不需要的空值。 我测试了六个图像:每个图像都有32x32像素和BGR颜色。 现在可以正常读取四个图像,而其余两个图像只能读取到第17个字节。从那以后,它们由空值组成,看起来像这样:

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

equals()

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; 是一个包含uint8_t和uint16_t字段的已定义结构。 为清楚起见,我删除了异常处理,在读取数据时我从未发现任何错误。 IrfanView和Gimp能够打开有问题的图像,在二进制查看器中找不到空值。我只选择了没有图像ID,没有色彩图和等效标题的图像,所以这不应该是一个问题。
那么为什么这些空值呢?

1 个答案:

答案 0 :(得分: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);