加载图像但没有存储在其数组中(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
为您提供 width
和 height
的原因加载图片:
size_t n = width * height * CHANNEL_NUM;
@paddy 指出的另一个问题是 cout
ing 一个 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] );
我想显示加载的 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
为您提供 width
和 height
的原因加载图片:
size_t n = width * height * CHANNEL_NUM;
@paddy 指出的另一个问题是 cout
ing 一个 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] );