Обработка странного PNG-8 с ImageIO
Я работаю над инструментом для Android, который принимает png в качестве входных данных, масштабирует его для нескольких плотностей и сохраняет их в каталоге. (Проект, который можно найти здесь: https://code.google.com/p/9patch-resizer/
Для открытия изображений я использую функцию ImageI readImage ( http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html)
Но у меня возникли некоторые проблемы с некоторыми файлами PNG-8, которые я сократил до минимального размера благодаря ImageOptim
Дело в том, что если я открою это изображение с помощью ImageIO, оно отбрасывает информацию о прозрачности, и это раздражает. (Это означает, что когда я изменяю масштаб и сохраняю его позже, прозрачность сбрасывается)
Вот изображение, о котором я говорю: и масштабированный вывод:
Если я использую метод createImage Toolkit ( http://docs.oracle.com/javase/6/docs/api/java/awt/Toolkit.html) вместо метода ImageIO, чтобы получить изображение работает правильно, но у меня нет такой информации, как цветовая модель и т. д.
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();
}
}
}