问题标签 [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.
c - 使用 stb_image 从 U 盘加载 PNG 图像
我在这里问是因为关于上述库的文档非常缺乏。正如标题中所写,我想从 USB 记忆棒加载 PNG 图像,然后使用它对其进行解码,stb_image
但我不知道该怎么做。
为了添加一些上下文,我使用了 ST 的发现板、STM32F769I并运行 FreeRTOS。
我首先认为只需"stbi_load"
使用完整路径进行调用("0:MYIMAGE.PNG")
就足够了,但事实并非如此。
因此,我想必须为此目的使用另一个功能,但哪个功能?stbi_load_from_memory
? 我不是很清楚。或者我应该先调用 FatFS 函数, f_open()
然后才能调用任何解码函数?
任何帮助都非常感谢。如果你能在这里写一个简单的例子来完成这项工作,那将非常有帮助。
提前致谢。
c++ - OpenGL未正确加载纹理数据
当没有给出纹理时,我一直在尝试为我的材质加载默认纹理。由于我使用的纹理加载器存在一些问题,我决定手动填充图像数据数组,然后将其传递给要绑定的 OpenGL 函数。不幸的是,这导致我的模型是黑色的,这意味着纹理没有正确加载。
下面显示了两个不同的构造函数。第一个从文件加载纹理(并且可以工作),而第二个用 255 个字符(应该是白色的)填充 char 缓冲区。InitTexture() 函数执行所有 OpenGL 函数来绑定纹理,并且适用于加载的纹理,但不适用于我的手动缓冲区。
我已经检查以确保数据正确,甚至将其与加载的纹理进行比较,该纹理只是一张白色图像并且值相同。
构造函数被设计用于初始化静态变量。不确定这是否会影响任何 OpenGL 功能。
我设法做的唯一解决方法是为漫反射纹理设置一个静态 Setter,并将加载的纯白色纹理的副本传递给它。
如果我可以提供更多信息,请告诉我。谢谢
编辑:
这是 InitTexture() 函数。它是处理绑定和生成纹理的所有 OpenGL 操作的函数。
编辑2:
在做了一些测试之后,我发现如果不是在构造函数中调用 InitTexture(),而是在我必须在 main 方法的开头调用的静态函数中调用它,并且由于某种原因,它可以工作。我的猜测是,当初始化静态成员变量时调用 OpenGL 函数时,缓冲区没有正确设置。不幸的是,我对 OpenGL 的了解还不够,无法知道它的元素何时被初始化。静态变量是否有可能在 OpenGL 之前被初始化?
c++ - 我可以使用 stb_image_write.h 将 JPG 图像写入内存吗?
我想从stbir_resize_uint8
(来自https://github.com/nothings/stb/blob/master/stb_image_resize.h)获得结果,将其压缩为 JPG 并将其存储到缓冲区而不将其保存到磁盘。
我已经得到了结果,stbir_resize_uint8
但unsigned char*
我不知道如何以 JPG 格式获取指向数据的指针。这可以用 stb_image_write.h 完成还是我需要另一个库?
我尝试stbi_write_jpg_to_func
从https://github.com/nothings/stb/blob/master/stb_image_write.h像这样使用。
//图像.h
//图像.cpp
这不会返回任何东西,但即使它确实返回了正确的结果,静态变量也非常难看。我如何在没有任何静态变量的情况下编写此方法?
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
java - 如何从字符串中的 getResourceAsStream 返回路径?
我正在使用 StbImage Lwjgl 3 库将图像上传到游戏。而且我遇到了这样一个问题,即使用通常的路径访问我的资产:纹理、模型以及加载时"assets/pack"
要么"textures/"
或"models/"
抛出一个。FileNotFoundException
这并不奇怪,因为我没有使用完整路径,也就是说,我不包括"resources/"
. 顺便说一下,这里是完整的路径"resources/assets/pack"
。我使用了 SlickUtil
它奏效了。但现在我用
,并且它只接受一个 (CharSequence) 字符串作为参数。我只需要将 getResourceAsStream 返回的路径作为常规字符串获取。我需要这个,以便使用 stbi_load (CharSequance charS .......),我可以从我的 jar 文件中读取文件。只是 StbImage 没有提供这个,因为它是一个 C 库。
附言。我知道网站上有类似的答案,但我只是想找出可能还有更好的方法来解决我的问题。
c++ - C++ GLFW setWindowIcon
因此,使用 GLFW 库在 C++ 中创建了一个窗口,该库还创建了一个 OpenGL 上下文。之后我决定在这个窗口中添加一个图标。有 2 个选项,使用 STB 或 SOIL 加载图标。我选择了机顶盒图像。我下载了它并将其添加到我的项目中。一切正常,没有错误,但由于某种原因我的图标没有出现。看来我指出的路径是正确的,并且在 VS 2019 的项目中包含了该路径。
由于我使用 premake5 来设置路径并简化程序集,因此我的路径是指定的,"%{prj.name}/libs/stb/include"
并且在 VS 2019 中只有一个基于应用程序名称的路径libs/stb/include
。
这是我的代码:
如果您需要查看我的窗口创建代码,这里是:
最后在 init 函数中编写代码:
c++ - stb_png_to_mem 的参数是什么意思?
我正在使用 stb 库为 OpenGL 动态加载纹理。我正在尝试使用 stb_image_write.h 中的函数。我找不到有关如何正确使用该功能的任何文档,stbi_write_png_to_mem
我的代码如下所示
我查看了 github 并查看了源代码本身。我在谷歌上找不到任何东西。我不确定这个函数的输入需要什么,因为什么都不清楚。该函数的来源是
我的目标是本质上将我的图片数据输出到内存中的 png,而不是文件,所以我可以在我的程序中的其他地方使用它,就像 png 一样格式化。
c++ - 使用 stb_image 库加载图像作为浮点输出错误值
当我使用STB_Image将图像加载为浮点数时,这些值似乎已关闭。我创建了一个图像来测试它。(这里使用的 RGB 代码是 [127, 255, 32])
当我加载这个图像时,unsigned char
我stbi_load()
得到了正确的值。但是当我将它加载为float
using时,stbi_loadf()
我得到了对我来说没有意义的错误值。
这是我用于测试的代码:
我得到的测试输出是这样的:
[0.22, 1.00, 0.01, 1.00]
[0.50, 1.00, 0.13, 1.00]
从理论上讲,这应该在两行上打印出相同的值,底部的值是正确的值,但由于某种原因它没有。
现在我当然可以使用 unsigned char 值并为自己编写一个将所有内容转换为正确浮点值的函数,但我觉得应该有一种方法可以只使用 STB_Image 本身来做到这一点。
c++ - 在已经使用仅标头库的项目中使用预编译标头?
我正在构建一个项目,我想制作一个预编译的头文件来提高性能。问题是我也在我的项目中使用 stbi_image 标头,这意味着我必须在我的项目中的所有 stbi 文件中包含我的标头,并确保其中没有重复的标头声明。
是否有另一种方法来包含 stbi 或绕过在这些文件中包含预编译头的方法?