问题描述
我想显示加载的 8 位图像中的值以进行代码分析,但发现加载的图像没有值?
我有以下主要帮助:
#define CHANNEL_NUM 1
int width,height,bpp;
uint8_t* image = stbi_load("FTTESTGS.bmp",&width,&height,&bpp,CHANNEL_NUM);
if (image == NULL) {printf("Error in loading the image\n");}
size_t n = sizeof(image) / sizeof(image[0]);
std::cout << "The size is " << n << '\n';
for (size_t i = 0; i < n; i++) {std::cout << image[i];}
std::cout << '\n' << "The largest element is " << *std::max_element(image,image + width * height) << '\n';
它编译。没有错误。不幸的是,我的输出显示大小为 8,没有值,最大的元素什么都没有。
The size is 8
The largest element is
我不确定问题出在哪里。欢迎任何建议!代码截图如下:
解决方法
stb_image 是用 C 编写的,因此它依赖于 C 数组而不是 C++ 的方便的标准容器。看来您对 C 数组没有太多经验,所以我建议您阅读它们。
至于手头的问题,@paddy 已经提到 sizeof 并没有完全按照您的想法行事。 stbi_load
在堆内部分配一个数组,将图像数据加载到它,并返回一个指针到该数组的第一个元素。由于 image
只是一个指针(您甚至如此声明),sizeof(image)
以字节为单位为您提供指针的大小(在 64 位系统上为 8)。
据我所知,您无法获得以这种方式分配的数组的大小,但这就是 stbi_load
为您提供加载图像的 width
和 height
的原因:
size_t n = width * height * CHANNEL_NUM;
@paddy 指出的另一个问题是 cout
使用 uint8_t
会导致打印字符。您可以阅读它 here 但长话短说:C++ 中的几个不幸的怪癖导致某些整数类型(int8_t
和 uint8_t
)被解释为字符({{1} } 和 char
)。为避免这种情况,您必须将它们显式转换为整数类型,该类型在打印时始终表现为整数(例如```unsigned int``)。查看 this 了解我的意思。
unsigned char