使用 LibGDX 创建的 PNG 中的颜色失真
Color distortion in PNGs created with LibGDX
我试过在 LibGDX 论坛上问过这个问题,但没有成功。
基本上,我创建了自己的打包器,它采用多个 spritesheet like these and packs them into something like this。因此,我可以将这些打包文件加载为具有 X 和 Y 偏移量的 TextureRegions 数组,这样就可以绘制它们,就好像它们实际上具有所有这些不必要的透明像素一样。
无论如何,我是这样做的:
- 将所选图像加载为像素图;
- 遍历它们的 "tiles"(例如,图像的 128x128px 部分);
- 找到每个图块的偏移量(偏移量是 rows/columns 的数量,只有透明像素);
- 将图块的non-transparent部分绘制成一个新的小像素图(继续示例,128-offsetLeft-offsetRight、128-offsetTop-offsetBottom,格式与加载的图像相同);
- 在容器中保存每个像素图和一些绘图数据(偏移量)。
- 对所有图块和图像重复此操作。
- 找到最有效的方法将容器中的图块打包到一个新的更大的像素图中(同样,格式相同)。
- 保存自定义描述文件。
- 将像素图保存为 PNG。
Pixmap-related 代码片段:
图片加载:
final Pixmap image = new Pixmap(imageData.getFileHandle());
将图像绘制成更小的部分:
final Pixmap tile =
new Pixmap(imageData.getTileWidth() - offsetLeft - offsetRight, imageData.getTileHeight()
- offsetTop - offsetBottom, image.getFormat());
tile.drawPixmap(image, -columnIndex * imageData.getTileWidth() - offsetLeft,
-rowIndex * imageData.getTileHeight() - offsetTop);
正在为打包图像创建新的像素图:
Pixmap packedImage =
new Pixmap(packedImageWidth, packedImageHeight, image.getFormat());
正在将图块绘制成像素图:
packedImage.drawPixmap(frame.getPixmap(), frame.getOriginX(), frame.getOriginY());
正在保存打包图像:
final PixmapIO.PNG png = new PixmapIO.PNG();
png.setCompression(Deflater.NO_COMPRESSION);
png.setFlipY(false);
try {
png.write(chosenDirectory.child(packedFileName + FILE_FORMAT), packedImage);
} catch (final IOException exception) {
throw new RuntimeException(exception);
}
因此,颜色有些失真:
(左:打包后,右:打包前,加载并渲染为纹理。)
我打包的任何步骤都会扭曲图像还是保存部分?我是否必须寻找另一种解决方案(纯 Java 图像处理?)或者是否有使用 LibGDX API 来保留颜色的方法?
由于您不希望将这些精灵混合到目标像素图上,而是替换那里的像素,我认为您希望在开始对任何内容调用 drawPixmap
之前设置 Pixmap.setBlending(Blending.None);
.
旁注:正如 Alexander Mironov 所说,LibGDX 的纹理打包器处理空白剥离,而 TextureAtlas class 为您提供了一个名为 AtlasSprite 的 Sprite subclass,它可以无形地处理定位图像就像空白仍然是它的一部分一样。各种 createSprite 方法实际上 return 一个 AtlasSprite 如果从原始源中删除了空格。
我试过在 LibGDX 论坛上问过这个问题,但没有成功。
基本上,我创建了自己的打包器,它采用多个 spritesheet like these and packs them into something like this。因此,我可以将这些打包文件加载为具有 X 和 Y 偏移量的 TextureRegions 数组,这样就可以绘制它们,就好像它们实际上具有所有这些不必要的透明像素一样。
无论如何,我是这样做的:
- 将所选图像加载为像素图;
- 遍历它们的 "tiles"(例如,图像的 128x128px 部分);
- 找到每个图块的偏移量(偏移量是 rows/columns 的数量,只有透明像素);
- 将图块的non-transparent部分绘制成一个新的小像素图(继续示例,128-offsetLeft-offsetRight、128-offsetTop-offsetBottom,格式与加载的图像相同);
- 在容器中保存每个像素图和一些绘图数据(偏移量)。
- 对所有图块和图像重复此操作。
- 找到最有效的方法将容器中的图块打包到一个新的更大的像素图中(同样,格式相同)。
- 保存自定义描述文件。
- 将像素图保存为 PNG。
Pixmap-related 代码片段:
图片加载:
final Pixmap image = new Pixmap(imageData.getFileHandle());
将图像绘制成更小的部分:
final Pixmap tile =
new Pixmap(imageData.getTileWidth() - offsetLeft - offsetRight, imageData.getTileHeight()
- offsetTop - offsetBottom, image.getFormat());
tile.drawPixmap(image, -columnIndex * imageData.getTileWidth() - offsetLeft,
-rowIndex * imageData.getTileHeight() - offsetTop);
正在为打包图像创建新的像素图:
Pixmap packedImage =
new Pixmap(packedImageWidth, packedImageHeight, image.getFormat());
正在将图块绘制成像素图:
packedImage.drawPixmap(frame.getPixmap(), frame.getOriginX(), frame.getOriginY());
正在保存打包图像:
final PixmapIO.PNG png = new PixmapIO.PNG();
png.setCompression(Deflater.NO_COMPRESSION);
png.setFlipY(false);
try {
png.write(chosenDirectory.child(packedFileName + FILE_FORMAT), packedImage);
} catch (final IOException exception) {
throw new RuntimeException(exception);
}
因此,颜色有些失真:
(左:打包后,右:打包前,加载并渲染为纹理。)
我打包的任何步骤都会扭曲图像还是保存部分?我是否必须寻找另一种解决方案(纯 Java 图像处理?)或者是否有使用 LibGDX API 来保留颜色的方法?
由于您不希望将这些精灵混合到目标像素图上,而是替换那里的像素,我认为您希望在开始对任何内容调用 drawPixmap
之前设置 Pixmap.setBlending(Blending.None);
.
旁注:正如 Alexander Mironov 所说,LibGDX 的纹理打包器处理空白剥离,而 TextureAtlas class 为您提供了一个名为 AtlasSprite 的 Sprite subclass,它可以无形地处理定位图像就像空白仍然是它的一部分一样。各种 createSprite 方法实际上 return 一个 AtlasSprite 如果从原始源中删除了空格。