0

我正在开发一个用于 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 的方法来获取图像,它工作正常,但我没有得到颜色模型等信息......

4

1 回答 1

1

这是一个对我有用的 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();
        }
    }
}
于 2013-09-16T12:11:15.710 回答