我正在为Android开发一个工具,它接受一个png作为输入,重新缩放几个密度,并将它们保存在一个目录中。(可在此处找到的项目:https://code.google.com/p/9patch-resizer/
为了打开图像,我使用了ImageIO的函数readImage (http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html#read(java.io.File)
但我在处理一些PNG-8文件时遇到了一些问题,多亏了ImageOptim,我才把这些文件缩小到最小
问题是,如果我用ImageIO打开这个图像,它会丢弃透明度信息,这很烦人。(意思是,当我重新缩放它,并在稍后保存它时,透明度将被丢弃)
这是我正在讨论的图像:

和重新缩放后的输出:

如果我使用Toolkit的createImage方法(http://docs.oracle.com/javase/6/docs/api/java/awt/Toolkit.html#createImage(java.lang.String)而不是ImageIO的方法)来获取图像,它可以正常工作,但我不需要获取颜色模型等信息。
发布于 2013-09-16 20:11:16
下面是一个PoC,它可以帮我解决这个问题:
public class TestPNGResampler {
public static void main(String[] args) throws IOException {
File file = new File(args[0]);
ImageInputStream input = ImageIO.createImageInputStream(file);
try {
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (!readers.hasNext()) {
System.err.println("No reader for " + file);
System.exit(1);
}
// Read image and metadata
ImageReader reader = readers.next();
reader.setInput(input);
IIOMetadata metadata = reader.getImageMetadata(0);
BufferedImage image = reader.read(0);
// Rescale the image to 22x66 as in OP (replace as you see fit)
image = new ResampleOp(22, 66, ResampleOp.FILTER_LANCZOS).filter(image, null);
// Write image with metadata from original image, to maintain tRNS chunk
ImageWriter writer = ImageIO.getImageWritersByFormatName("PNG").next();
ImageOutputStream output = ImageIO.createImageOutputStream(new File(args[0] + "_mod.png"));
try {
writer.setOutput(output);
writer.write(new IIOImage(image, Collections.<BufferedImage>emptyList(), metadata));
}
finally {
output.close();
}
}
finally {
input.close();
}
}
}https://stackoverflow.com/questions/18824870
复制相似问题