在 PNG 中,调色板始终存储在 RGB8 中(每个索引 = 颜色 3 个字节),具有任意(最多 256)个条目。如果您当前有一个带有 16 色调色板的 8 位图像(总共 16 个条目),则不需要更改调色板,只需重新打包像素字节(每个字节两个索引)。如果是这样,我认为您可以使用以下代码(未经测试)使用PNGJ来做到这一点:
public static void reencode(String orig, String dest) {
PngReader png1 = FileHelper.createPngReader(new File(orig));
ImageInfo pnginfo1 = png1.imgInfo;
ImageInfo pnginfo2 = new ImageInfo(pnginfo1.cols, pnginfo1.rows, 4, false,false,true);
PngWriter png2 = FileHelper.createPngWriter(new File(dest), pnginfo2, false);
png2.copyChunksFirst(png1, ChunksToWrite.COPY_ALL);
ImageLine l2 = new ImageLine(pnginfo2);
for (int row = 0; row < pnginfo1.rows; row++) {
ImageLine l1 = png1.readRow(row);
l2.tf_pack(l1.scanline, false);
l2.setRown(row);
png2.writeRow(l2);
}
png1.end();
png2.copyChunksLast(png1, ChunksToWrite.COPY_ALL);
png2.end();
System.out.println("Done");
}
在其他地方,如果您当前的调色板有 16 种“已使用”颜色(但它的长度更大,因为它包含未使用的颜色),您需要做一些工作,修改调色板块(但也可以这样做)。