【发布时间】:2017-10-10 09:32:43
【问题描述】:
我正在尝试编写一个简单的 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
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、没有颜色图和等效标题的图像,所以这也不应该是一个问题。
那么为什么会有这些空值呢?
【问题讨论】:
-
也许从那时起图像只是黑色的。也许文件由于某种原因被截断或损坏。您似乎没有检查任何
read()s 是否真的成功。 -
我检查了
read()s 是否真的在做他们的工作,一切似乎都很好。
标签: c++ image image-processing ifstream tga