问题标签 [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 投票
0 回答
92 浏览

c - 使用 stb_image 从 U 盘加载 PNG 图像

我在这里问是因为关于上述库的文档非常缺乏。正如标题中所写,我想从 USB 记忆棒加载 PNG 图像,然后使用它对其进行解码,stb_image但我不知道该怎么做。

为了添加一些上下文,我使用了 ST 的发现板、STM32F769I并运行 FreeRTOS。

我首先认为只需"stbi_load"使用完整路径进行调用("0:MYIMAGE.PNG")就足够了,但事实并非如此。

因此,我想必须为此目的使用另一个功能,但哪个功能?stbi_load_from_memory? 我不是很清楚。或者我应该先调用 FatFS 函数, f_open()然后才能调用任何解码函数?

任何帮助都非常感谢。如果你能在这里写一个简单的例子来完成这项工作,那将非常有帮助。

提前致谢。

0 投票
0 回答
295 浏览

c++ - OpenGL未正确加载纹理数据

当没有给出纹理时,我一直在尝试为我的材质加载默认纹理。由于我使用的纹理加载器存在一些问题,我决定手动填充图像数据数组,然后将其传递给要绑定的 OpenGL 函数。不幸的是,这导致我的模型是黑色的,这意味着纹理没有正确加载。

下面显示了两个不同的构造函数。第一个从文件加载纹理(并且可以工作),而第二个用 255 个字符(应该是白色的)填充 char 缓冲区。InitTexture() 函数执行所有 OpenGL 函数来绑定纹理,并且适用于加载的纹理,但不适用于我的手动缓冲区。

我已经检查以确保数据正确,甚至将其与加载的纹理进行比较,该纹理只是一张白色图像并且值相同。

构造函数被设计用于初始化静态变量。不确定这是否会影响任何 OpenGL 功能。

我设法做的唯一解决方法是为漫反射纹理设置一个静态 Setter,并将加载的纯白色纹理的副本传递给它。

如果我可以提供更多信息,请告诉我。谢谢

编辑:

这是 InitTexture() 函数。它是处理绑定和生成纹理的所有 OpenGL 操作的函数。

编辑2:

在做了一些测试之后,我发现如果不是在构造函数中调用 InitTexture(),而是在我必须在 main 方法的开头调用的静态函数中调用它,并且由于某种原因,它可以工作。我的猜测是,当初始化静态成员变量时调用 OpenGL 函数时,缓冲区没有正确设置。不幸的是,我对 OpenGL 的了解还不够,无法知道它的元素何时被初始化。静态变量是否有可能在 OpenGL 之前被初始化?

0 投票
2 回答
102 浏览

c++ - 我无法通过 OpenGL 和 stb_load() 正确读取图片

我无法正确加载以下图片 在此处输入图片描述

这是我的加载结果。 在此处输入图像描述

这是我的代码。我使用 stb_load() 和 glTexImage2d() 读取图片并使用 GL_RGB 格式,但结果就像图片显示一样错位。

我不知道哪里错了,如果你能帮助我,我很高兴。

0 投票
2 回答
1487 浏览

c++ - 我可以使用 stb_image_write.h 将 JPG 图像写入内存吗?

我想从stbir_resize_uint8(来自https://github.com/nothings/stb/blob/master/stb_image_resize.h)获得结果,将其压缩为 JPG 并将其存储到缓冲区而不将其保存到磁盘。

我已经得到了结果,stbir_resize_uint8unsigned char*我不知道如何以 JPG 格式获取指向数据的指针。这可以用 stb_image_write.h 完成还是我需要另一个库?

我尝试stbi_write_jpg_to_funchttps://github.com/nothings/stb/blob/master/stb_image_write.h像这样使用。

//图像.h

//图像.cpp

这不会返回任何东西,但即使它确实返回了正确的结果,静态变量也非常难看。我如何在没有任何静态变量的情况下编写此方法?

0 投票
1 回答
595 浏览

android - 在 Java 上创建位图并使用 JNI 将其发送到 C++ 并由 OpenGL 渲染,黑色

在 Android 上,我使用 JNI 将字符串从 C++ 发送到 Java,然后将其绘制为位图,然后将字节数组返回给 C++ 以将其绘制到 OpenGL,我得到一个黑色矩形。

首先,我通过这种方式在 Java 中创建位图:

然后在 C++ 中,我通过这种方式通过 JNI 调用前面的函数:

最后我得到了 char 数组和长度,现在我在 OpenGL 中创建了一个纹理:

我得到一个与位图宽度和高度相同的黑色矩形。

编辑:

我从 Java 端将位图保存为 PNG,然后从 C++ 重新加载它,它使用相同的代码完美呈现,所以问题出在字节数组或 GL 参数或其他方面?

编辑2:

我注意到在 Java 中ByteArray包含带负值的带符号字节,当它unsigned char*在 C++ 中被强制转换时,它的值发生了变化,例如,Java 中字节数组中的第一个字节是 -119 如果强制转换为无符号字符则变为 137

0 投票
0 回答
188 浏览

java - 如何从字符串中的 getResourceAsStream 返回路径?

我正在使用 StbImage Lwjgl 3 库将图像上传到游戏。而且我遇到了这样一个问题,即使用通常的路径访问我的资产:纹理、模型以及加载时"assets/pack"要么"textures/""models/"抛出一个。FileNotFoundException这并不奇怪,因为我没有使用完整路径,也就是说,我不包括"resources/". 顺便说一下,这里是完整的路径"resources/assets/pack"。我使用了 SlickUtil

它奏效了。但现在我用

,并且它只接受一个 (CharSequence) 字符串作为参数。我只需要将 getResourceAsStream 返回的路径作为常规字符串获取。我需要这个,以便使用 stbi_load (CharSequance charS .......),我可以从我的 jar 文件中读取文件。只是 StbImage 没有提供这个,因为它是一个 C 库。

附言。我知道网站上有类似的答案,但我只是想找出可能还有更好的方法来解决我的问题。

0 投票
1 回答
863 浏览

c++ - C++ GLFW setWindowIcon

因此,使用 GLFW 库在 C++ 中创建了一个窗口,该库还创建了一个 OpenGL 上下文。之后我决定在这个窗口中添加一个图标。有 2 个选项,使用 STB 或 SOIL 加载图标。我选择了机顶盒图像。我下载了它并将其添加到我的项目中。一切正常,没有错误,但由于某种原因我的图标没有出现。看来我指出的路径是正确的,并且在 VS 2019 的项目中包含了该路径。

由于我使用 premake5 来设置路径并简化程序集,因此我的路径是指定的,"%{prj.name}/libs/stb/include"并且在 VS 2019 中只有一个基于应用程序名称的路径libs/stb/include

这里的图像

这是我的代码:

如果您需要查看我的窗口创建代码,这里是:

最后在 init 函数中编写代码:

它没有图标的我的窗口的屏幕截图

0 投票
1 回答
794 浏览

c++ - stb_png_to_mem 的参数是什么意思?

我正在使用 stb 库为 OpenGL 动态加载纹理。我正在尝试使用 stb_image_write.h 中的函数。我找不到有关如何正确使用该功能的任何文档,stbi_write_png_to_mem我的代码如下所示

我查看了 github 并查看了源代码本身。我在谷歌上找不到任何东西。我不确定这个函数的输入需要什么,因为什么都不清楚。该函数的来源是

我的目标是本质上将我的图片数据输出到内存中的 png,而不是文件,所以我可以在我的程序中的其他地方使用它,就像 png 一样格式化。

0 投票
1 回答
4469 浏览

c++ - 使用 stb_image 库加载图像作为浮点输出错误值

当我使用STB_Image将图像加载为浮点数时,这些值似乎已关闭。我创建了一个图像来测试它测试图像。(这里使用的 RGB 代码是 [127, 255, 32])
当我加载这个图像时,unsigned charstbi_load()得到了正确的值。但是当我将它加载为floatusing时,stbi_loadf()我得到了对我来说没有意义的错误值。

这是我用于测试的代码:

我得到的测试输出是这样的:

[0.22, 1.00, 0.01, 1.00]
[0.50, 1.00, 0.13, 1.00]

从理论上讲,这应该在两行上打印出相同的值,底部的值是正确的值,但由于某种原因它没有。
现在我当然可以使用 unsigned char 值并为自己编写一个将所有内容转换为正确浮点值的函数,但我觉得应该有一种方法可以只使用 STB_Image 本身来做到这一点。

0 投票
0 回答
88 浏览

c++ - 在已经使用仅标头库的项目中使用预编译标头?

我正在构建一个项目,我想制作一个预编译的头文件来提高性能。问题是我也在我的项目中使用 stbi_image 标头,这意味着我必须在我的项目中的所有 stbi 文件中包含我的标头,并确保其中没有重复的标头声明。

是否有另一种方法来包含 stbi 或绕过在这些文件中包含预编译头的方法?