问题标签 [stb-image]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1230 浏览

opengl - 如何解决“无 SOI”的 stbi_load 错误?

我正在通过 加载图片stbi_load,但出现了错误no SOI。我在另一个项目中使用了该图片,并且加载成功。所以我认为图片和图片的路径是有效的。但是我不知道为什么会发生错误?以下是一些主要代码:

loadTextureFromFile("./Data/awesomeface.png", GL_TRUE);用来获取纹理。并stbi_failure_reason()返回no SOI。当我在VS2013中调试项目时,内存image有效但显示characters in a string are invalid. 有人帮忙吗?

0 投票
0 回答
284 浏览

c++ - STB 图片不加载图片

我正在使用 stb 图像库加载大型 PNG 图像。以下代码适用于其他图像,所以我很确定周围的代码是正确的。

加载后 nrChannels 也为 0。这是大小为 166800x1029 像素的 RGBA PNG 图像 - 38.5 MB

同一文件夹中的其他半透明 rgba 图像工作正常。

是图像大小的问题吗?我可以使用的最大图像是多少?

一些图像属性:

特性

0 投票
1 回答
745 浏览

c++ - 使用 stbi_write_png 从 OpenGL 帧缓冲区保存的 PNG 向右移动

几天来,我一直在尝试解决这个视觉错误,但没有成功,所以我问这个问题,看看是否有人可以帮助我了解正在发生的事情。

首先我将在没有任何代码的情况下描述问题,然后我将展示一些代码。情况如下:

  • 我的 OpenGL 应用程序将此图像渲染到多重采样帧缓冲区:

    在此处输入图像描述

  • 然后,我将该多样本帧缓冲区 blit 到常规帧缓冲区(不是多样本帧缓冲区)。

  • 然后,我使用glReadPixels.

  • 最后,我stbi_write_png用无符号字节数组调用。这是结果:

    在此处输入图像描述

对我来说,第一行字节似乎向右移动,这导致所有其他行都被移动,从而形成对角线形状。

这是我的代码:

  • 要创建多重采样帧缓冲区:
  • 要创建常规帧缓冲区:
  • 请注意,两个帧缓冲区都报告为完整的。

  • 要将多样本帧缓冲区 blit 到常规帧缓冲区,请从常规帧中读取并写入 PNG 图像:

  • 请注意,glGetError 不会报告任何错误。

我一直无法弄清楚出了什么问题。感谢您的任何帮助!

0 投票
1 回答
138 浏览

c++ - OpenGL 4.1 和更低的黑色纹理,Mac 和 Windows

在不支持 OpenGL 4.5 和 mac 的低端 PC 上编译我的 OpenGL 代码时,我遇到了这个问题。在我的常规代码中,我会使用 glCreateTextures 和 glTextureStorage2D 之类的函数,但其​​他版本不支持它们,所以我选择了其他 glGenTextures 路径。

这是图像生成代码:

我想将我的纹理绑定到 GPU 上的特定插槽,所以我有这个功能:

这是绘制的屏幕截图: 在此处输入图像描述

为了确保这不是渲染问题,我决定将它放入 ImGui 的渲染器中。 在此处输入图像描述

这是我应该得到的图片:

在此处输入图像描述

并且图像导入正确,我没有收到错误,并且相同的导入代码和路径在高端 PC 上工作,唯一改变的是高端 PC 具有 OpenGL 4.5 纹理生成代码。

0 投票
0 回答
234 浏览

c - `stbi_failure_reason()` 不返回 SOI,但会加载文件

我正在使用 stb_image_load加载png 文件。代码看起来像

现在 stbi_failure_reason() 返回no SOIpixels不为空并完美加载纹理。github 上关于这个的第一个结果是关于格式错误的 png 标头,所以我使用 pngcheck 进行了检查,但它说 png 文件是好的。

知道为什么会发生这种情况吗?我在加载此图像时也遇到了问题但是它可以与其他图像一起使用,将来有什么办法可以避免这种情况吗?

0 投票
1 回答
156 浏览

stb-image - 使用 stbi_set_flip_vertically_on_load 函数时未解决的错误

使用 stbi_set_flip_vertically_on_load 函数时出现未解决的符号错误。

我已将#include <stb_image.h> 文件添加为标题,我还需要做其他事情吗?

stb_image - v2.19

0 投票
0 回答
118 浏览

c++ - 将图像数据保存到 sqlite

我有一个从文件加载图像并成功创建opengl纹理的函数。

我想要做的是通过stbi_load上面的方法加载图像并将其保存为 BLOB 到 sqlite。之后我希望能够加载相同的 blob 并在单独的函数中从它创建一个 opengl 纹理。

在第一步中,我创建了一个只加载图像的函数:

在下一步中,我想将此数据存储到我的 sqlite 数据库中:

最后,我将各个部分连接起来:

发生的情况是看似任意的数据最终会出现在数据库中,这绝对不是图像数据。有时条目只是空的。

我怀疑我处理的返回类型stbi_load不正确,将随机内存数据强制输入数据库。从 stbi 文档中提取:

图像加载器的返回值是一个指向像素数据的“unsigned char *”。

据我了解,我只是将接受的数组指针传递给sqlite3_bind_blob它。那么为什么它适用于一个而不适用于另一个呢?或者错误源可能在其他地方?const void *glTexImage2D

编辑

我还尝试了别的东西。通常我在调用 ie 时通过 -1 作为 size sqlite3_bind_text,因为调用会自动搜索空终止符。所以我认为在调用时我可能必须以字节为单位传递正确的大小,sqlite3_bind_blob因为那里可能没有终结符。因此,对于具有 3 个通道的 225 x 225 大小的图像,我将225 * 225 * 3其作为大小参数传递。不幸的是,这也不起作用。

0 投票
0 回答
196 浏览

c - 在 MacOS 上使用 stb_image 库时无法使用 cmake 构建 C 项目

当我尝试使用这个 cmake 文件构建我的项目时:

我收到以下 cmake 错误:

这是我在源文件中包含库的地方

我已经查看了有关使用 cmake 安装 stb_image 的堆栈溢出的所有相关问题,但这些解决方案都没有为我工作。我究竟做错了什么 ?

我已经用 GCC 编译了我的代码,它工作正常,但现在我需要使用我的 IDE 的调试器,为此我必须用 cmake 编译它。

0 投票
1 回答
327 浏览

stb-image - stbir_resize_uint8 在内存访问时崩溃

我正在使用 stb_image 将图像上传到 GPU。如果我只是使用 stbi_load 上传图像,我可以确认(nvidia Nsight)图像已正确存储在 GPU 内存中。但是,我喜欢在上传到 GPU 之前调整一些图像的大小。在这种情况下,我会崩溃。这是代码:

当此代码在规模设置为 的情况下运行时1.0f,它可以正常工作。但是,当我将比例设置为 时0.25f,程序在方法中崩溃stbir_resize_uint8。我在这两种情况下提供的图像都是1920x1080 RGBA PNG. Alpha 通道设置为1.0f横跨整个图像。

我必须使用哪个函数来调整图像大小?

编辑:如果我自己分配内存,该函数不再崩溃并且工作正常。但我虽然 stb 在内部处理所有内存分配。我错了吗?

0 投票
0 回答
46 浏览

c++ - #define STB_IMAGE_IMPLEMENTATION 在 stb_image 中做了什么

我正在尝试使用stb_image在 OpenGL 程序中将图像文件加载为纹理,头文件 stb_image.h 的文档说明如下:

"这样做:

在将此文件包含在一个C 或 C++ 文件中以创建实现之前。”

这种类型的预处理器指令实际上做了什么?

为了读者的利益,这里是我的项目的结构。

  1. 主文件
  2. stb_image.h

main.cpp 文件的标题如下所示: