You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用stbi_load方法传入int参数报错类型不匹配该如何解决

问题原因

报错已经明确说明参数类型不匹配:你调用stbi_load时传入的参数类型和方法定义的要求不符。
当前STBImage类中stbi_load方法的签名为stbi_load(ByteBuffer, IntBuffer, IntBuffer, IntBuffer, int),而你传入的参数是(String, int, int, int, int),存在两处不兼容:

  1. 第一个参数要求是ByteBuffer类型,你传入了String类型的路径
  2. 第二、三、四个参数要求是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:57:05