读取 TGA 显示空值而不是颜色数据
Reading TGA shows nulls instead of color data
我正在尝试编写一个简单的TGA加载器,我发现读取一些图像在某个点之后会产生很多不需要的空值。我正在测试六张图像:每张图像都有 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:
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能够打开有问题的图像,并且在二进制查看器中没有发现空值。我只选择了没有图像 ID 的图像,也没有颜色图和等效的标题,所以这也应该不是问题。
那么为什么这些空值在那里呢?
最后我发现了问题:由于我看不到ifstream位置跳到大约450的原因。从那里开始,即使标头信息位于前 18 个字节中,也可以读取标头。因此,在读取标题后,我只是将 ifstream 位置设置为颜色数据开始的点:
vector<uint8_t> * imRawData = new vector<uint8_t> (imSize);
myFile->seekg(ios_base::beg + 18);
myFile->read((char *) imRawData->data(), imSize);
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- GLSL 将颜色数据从片段着色器发送到顶点着色器似乎总是等于 0
- 如何从 GIFLIB 保存图像结构中获取 RGB 颜色数据
- 如何使用stb_image将像素颜色数据写入 BMP 图像文件?
- 如何在 QLabel 中以像素为单位放置颜色数据
- 读取 TGA 显示空值而不是颜色数据
- 渲染颜色数据到一个窗口,Win32
- 带alpha的WebP会丢失颜色通道数据
- 如何使用CreateDIBSection在BITMAPINFO中写入颜色数据
- 从指定坐标[x, y]处的位图数据获取像素颜色
- 将一组颜色数据保存为DS上的PNG文件