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

时间:2015-01-13 10:12:12

标签: java image image-processing libgdx png

我试过在LibGDX论坛上问这个问题没有运气。

基本上,我已经创建了自己的打包程序,它需要多个spritesheets like these并将它们打包成like this。因此,我可以将这些打包文件作为TextureRegions的数组加载它们的X和Y偏移量,这样就可以将它们绘制成实际上具有所有这些不必要的透明像素。

无论如何,这就是我的所作所为:

  • 将所选图片加载为pixmaps;
  • 迭代他们的“图块”(例如,图像的128x128px部分);
  • 查找每个图块的偏移量(偏移量是仅包含透明像素的行/列数量);
  • 将图块的非透明部分绘制成一个新的小像素图(继续示例,128-offsetLeft-offsetRight,128-offsetTop-offsetBottom,格式与加载的图像相同);
  • 将每个像素图与一些绘图数据(偏移)保存在容器中。
  • 重复所有瓷砖和图像。
  • 找到最有效的方法将瓷砖从容器打包成一个新的,更大的像素图(同样的格式)。
  • 保存自定义说明文件。
  • 将pixmap保存为PNG。

与Pixmap相关的代码段:

图片加载:

  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:

  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);
  } 

因此,颜色有些扭曲: SfxPacker

(左:包装后,右:包装前,装载并呈现为纹理。)

我打包的任何步骤都会扭曲图像还是保存部分?我是否必须寻找另一种解决方案(纯Java图像处理?)或者有没有办法使用LibGDX API保留颜色?

1 个答案:

答案 0 :(得分:3)

由于您不希望将这些精灵混合到目标Pixmap上,而是替换那里的像素,我认为您要在开始调用任何内容Pixmap.setBlending(Blending.None);之前设置drawPixmap

旁白:正如Alexander Mironov所说,LibGDX的纹理打包器处理空白剥离,而TextureAtlas类为您提供了一个名为AtlasSprite的Sprite子类,它无形地处理图像的定位,就好像空白仍然是它的一部分一样。如果从原始源中删除了空格,则各种createSprite方法实际返回AtlasSprite。