如何在 Java 中将 libGDX 的纹理转换为字节数组并再次返回

Posted

技术标签:

【中文标题】如何在 Java 中将 libGDX 的纹理转换为字节数组并再次返回【英文标题】:How to convert libGDX's Texture to byte array and back again in Java 【发布时间】:2021-03-28 17:24:27 【问题描述】:

所以我正在开发一个使用 libgdx 和 java 的小型多人游戏。我正在使用数据报套接字和数据报包在客户端之间发送消息。为了发送数据,我需要将其转换为字节数组。我一直在寻找一种将 libgdx 纹理转换为字节数组的方法,但找不到解决方案。我无法让该类实现 Serializable,因为我无权访问该类。 我将不胜感激任何帮助解决我的问题。提前致谢!

【问题讨论】:

如果您不能直接从纹理中读取它,请尝试将纹理转换为 Pixmap 并从那里读取。 【参考方案1】:

您可以使用来自this answer 的以下 sn-p 将您的 Texture 转换为像素图:

Texture texture = textureRegion.getTexture();
if (!texture.getTextureData().isPrepared()) 
    texture.getTextureData().prepare();

Pixmap pixmap = texture.getTextureData().consumePixmap();

当您获得Pixmap 后,您可以调用getPixels() 方法,该方法将返回一个ByteBuffer,其中包括像素数据的字节数组。您可以通过在ByteBuffer 上调用get(byte[]) 方法将原始数据读入byte[]

ByteBuffer byteBuffer = pixmap.getPixels();
byte[] pixelDataByteArray = new byte[byteBuffer.remaining()];
byteBuffer.get(pixelDataByteArray);

要将byte[] 转换回Texture,您可以像这样使用PixmapTexture 的构造函数:

Texture fromByteArray = new Texture(new Pixmap(pixelDataByteArray, 0, pixelDataByteArray.length));

【讨论】:

当我调用 byteBuffer.array() java 时会抛出不支持的操作异常。我应该使用某个版本的 java 吗? ByteBuffer 是 Java 中的一个抽象类。这意味着它可以有多种实现,而且似乎Pixmap 使用了一个不支持array() 方法的实现。但除了使用array() 方法,您还可以使用get(byte[]) 方法将字节读取到数组中,如this answer 中所述。我相应地编辑了答案。

以上是关于如何在 Java 中将 libGDX 的纹理转换为字节数组并再次返回的主要内容,如果未能解决你的问题,请参考以下文章

无法在libGDX中将纹理加载到AssetManager

LibGDX 3d 模型纹理未正确渲染

如何使用libGDX更改Scene2D图像中的纹理?

在meshlab中将顶点颜色转换为UV纹理

如何在 libgdx 中重用帧缓冲纹理

libgdx SpriteBatch 渲染到纹理