加载图像但没有存储在其数组中(C++,stbi_load)

Loading image but nothing stored in its array (C++, stbi_load)

我想显示加载的 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 在内部堆上分配一个数组,将图像数据加载到其中,并且 returns 一个 指针 指向该数组的第一个元素。因为 image 只是一个指针(你甚至这样声明它),sizeof(image) 给你一个指针的大小(在 64 位系统上是 8 个字节)。

据我所知,您无法获得以这种方式分配的数组的大小,但这就是 stbi_load 为您提供 widthheight 的原因加载图片:

size_t n = width * height * CHANNEL_NUM;

@paddy 指出的另一个问题是 couting 一个 uint8_t 将导致打印一个 character。您可以阅读它 here but long story short: a couple of unfortunate quirks in C++ lead to some integer types (int8_t and uint8_t) getting interpreted as chars (char and unsigned char). To avoid this, you have to explicitly cast them to an integer type that always behaves as an integer (```unsigned int`` for example) when printing. Check this 了解我的意思。

static_cast<unsigned int>( image[i] );