使用 LibGDX 创建的 PNG 中的颜色失真

Color distortion in PNGs created with LibGDX

我试过在 LibGDX 论坛上问过这个问题,但没有成功。

基本上,我创建了自己的打包器,它采用多个 spritesheet like these and packs them into something like this。因此,我可以将这些打包文件加载为具有 X 和 Y 偏移量的 TextureRegions 数组,这样就可以绘制它们,就好像它们实际上具有所有这些不必要的透明像素一样。

无论如何,我是这样做的:

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 如果从原始源中删除了空格。