问题似乎是由于在我使用 pngtastic 优化的 PNG 中使用了 zopfli 压缩。解决方法是使用不同的 pngtastic 压缩选项,然后可以在 Photoshop 中读取 PNG。
使用不同的压缩算法将导致较少的优化。
我不知道为什么 zopfli 压缩是个问题,可能是我的代码有问题(尽管当只更改 zopli 选项时相同的代码工作正常),在 pngtastic 中,或者 MacOS 和 Adobe 没有支持zopfli。
@usr2564301 进行了一些调查,我的示例图像中压缩数据的 Adler-32 校验和似乎不正确。usr2564301 还测试了 pngtastic 代码,发现它产生了正确的校验和。问题可能在于我如何处理来自 pngtastic 的字节流。
下面的代码使用 pngtastic (com.googlecode.pngtastic.core) 执行 PNG 优化
public static final String OPT_ZOPFLI = "zopfli";
public static final String OPT_DEFAULT = "default";
public static final String OPT_IMAGEOPTIM = "imageoptim";
private String optimization = OPT_ZOPFLI;
public void optimizePng(File infile, String out) {
final InputStream in;
try {
in = new BufferedInputStream(new FileInputStream(infile));
final PngImage image = new PngImage(in);
// optimize
final PngOptimizer optimizer = new PngOptimizer();
optimizer.setCompressor(optimization, 1);
final PngImage optimizedImage = optimizer.optimize(image, false, 9);
// export the optimized image to a new file
final ByteArrayOutputStream optimizedBytes = new ByteArrayOutputStream();
optimizedImage.writeDataOutputStream(optimizedBytes);
optimizedImage.export(out, optimizedBytes.toByteArray());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}