调用stbi_load方法传入int参数报错类型不匹配该如何解决
问题原因
报错已经明确说明参数类型不匹配:你调用stbi_load时传入的参数类型和方法定义的要求不符。
当前STBImage类中stbi_load方法的签名为stbi_load(ByteBuffer, IntBuffer, IntBuffer, IntBuffer, int),而你传入的参数是(String, int, int, int, int),存在两处不兼容:
- 第一个参数要求是
ByteBuffer类型,你传入了String类型的路径 - 第二、三、四个参数要求是
IntBuffer类型,你传入了基础类型int
出现这个设计的原因是Java版STBImage是对原生C语言stb_image库的封装,C语言中通过传递int指针来返回加载后的图片宽、高、通道数,Java没有指针概念,因此用IntBuffer这种堆外缓冲区模拟输出参数,不需要你提前读取图片宽高传入。
解决方案
你不需要提前用ImageIO读取图片宽高,直接按方法要求传入对应类型的参数即可,修改后的代码示例如下:
import org.lwjgl.BufferUtils; import org.lwjgl.stb.STBImage; import java.nio.ByteBuffer; import java.nio.IntBuffer; // 分配容量为1的IntBuffer,用来接收返回的宽、高、通道数 IntBuffer widthBuffer = BufferUtils.createIntBuffer(1); IntBuffer heightBuffer = BufferUtils.createIntBuffer(1); IntBuffer channelsBuffer = BufferUtils.createIntBuffer(1); // 调用stbi_load加载图片,LWJGL封装的STBImage自带支持String路径的重载 ByteBuffer data = STBImage.stbi_load("/sprites/" + filename, widthBuffer, heightBuffer, channelsBuffer, 0); // 加载完成后从Buffer中读取实际的宽高值 int width = widthBuffer.get(0); int height = heightBuffer.get(0); // 注意:资源使用完成后必须调用该方法释放原生内存,避免内存泄漏 STBImage.stbi_image_free(data);
额外注意事项
- 如果调用后
data返回null,说明图片加载失败,可以调用STBImage.stbi_failure_reason()获取具体失败原因 - 如果你使用的STBImage版本没有支持String路径的重载,可以先将文件读取到直接ByteBuffer中,再调用
stbi_load_from_memory方法加载
内容的提问来源于stack exchange,提问作者ralph367
相关产品推荐
相关产品推荐

