gpt4 book ai didi

java - 使用 ImageIO 处理奇怪的 png-8

转载 作者:行者123 更新时间:2023-12-01 14:07:04 29 4
gpt4 key购买 nike

我正在开发一个 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 打开这个图像,它会丢弃透明度信息,这很烦人。 (意思是,当我重新缩放它并稍后保存时,透明度将被丢弃)

这是我正在谈论的图像:background和重新缩放的输出:rescaled background

如果我使用 Toolkit 的 createImage 方法( http://docs.oracle.com/javase/6/docs/api/java/awt/Toolkit.html#createImage(java.lang.String) )而不是 ImageIO 的方法来获取图像,它可以正常工作,但我没有获取颜色模型等信息...

最佳答案

这是一个对我有用的 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();
}
}
}

关于java - 使用 ImageIO 处理奇怪的 png-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18824870/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com