java - 使用 Java 或 Python 将 8 位(16 色调色板)PNG 转换为适当的 4 位(16 色调色板)?

标签 java python png pypng

我有一堆图像,很多是 16 色 8 位 PNG 格式的图像,我需要 16 位 4 位格式,它们都有相同的调色板。

我正在 Google 上搜索最好的库,但我没有找到太多关于这个特定问题的信息,所以我来这里希望能找到一些更有针对性的解决方案。

我正在尝试使用基于 other answers I have found here 的 PIL , 但没有任何运气。

img = Image.open('DownArrow_focused.png')
img = img.point(lambda i: i * 16, "L")
img.save('DownArrow_focused.png', 'PNG')

但这给了我一个灰度图像,而不是我想要的。

PIL 不会工作,尝试 PyPNG。 GIMP 这样做,但我有数百个这样的东西,我需要对它们进行批处理。并批量进行转换,所以这不是一次性的事情。

基于 Java 的解决方案也是可以接受的,几乎所有我可以在 Linux/OSX 机器上从命令行运行的东西都是可以接受的。

最佳答案

在 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 种“已用”颜色(但它的长度更长,因为它包含未使用的颜色),您需要做一些工作,修改调色板 block (但也可以完成)。

关于java - 使用 Java 或 Python 将 8 位(16 色调色板)PNG 转换为适当的 4 位(16 色调色板)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7535716/

相关文章:

java - Quartz 调度程序的行为不一致

java - Maven:com.example.speech:speech-google-cloud-samples 的不可解析父 POM

python - 使用SSIM尝试比较图像并尝试分别获取亮度,对比度和结构

python - Heroku 不再支持 Celery 了吗?

java - Motorola 手机上的 J2ME 应用程序中的图像加载问题

java - 打印结果表时出现问题

Java Try Catch block

转换/展平包含嵌套表作为字典列表结构的 JSON 的 Pythonic 方法

python - 如何在 Python 中创建一个空的 n*m PNG 文件?

r - 如何在 R : load an image file, 中在图像上打印文本,保存修改后的图像