1

我想在加载的 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  

我不确定问题出在哪里。欢迎任何建议!这是代码的屏幕截图:

在此处输入图像描述

4

1 回答 1

2

stb_image是用 C 语言编写的,因此它依赖于 C 数组,而不是方便的 C++ 标准容器。看起来您对 C 数组没有太多经验,所以我建议您阅读它们。


至于手头的问题,@paddy 已经提到sizeof并没有完全按照您的想法做。stbi_load在堆内部分配一个数组,将图像数据加载到其中,并返回指向该数组第一个元素的指针。由于image只是一个指针(您甚至将其声明为这样),因此sizeof(image)以字节为单位为您提供指针的大小(在 64 位系统上为 8)。

据我所知,您无法获得以这种方式分配的数组的大小,但这就是为什么stbi_load给您加载图像的widthand :height

size_t n = width * height * CHANNEL_NUM;

@paddy 指出的另一个问题是couting anuint8_t将导致打印字符。您可以在此处阅读它,但长话短说:C++ 中的一些不幸的怪癖导致某些整数类型 ( int8_tand uint8_t) 被解释为字符 ( charand unsigned char)。为避免这种情况,您必须将它们显式转换为整数类型,该类型在打印时始终表现为整数(例如```unsigned int``)。看看这个看看我的意思。

static_cast<unsigned int>( image[i] );
于 2021-01-29T10:36:57.583 回答