2013-09-16 4 views
0

Я работаю над инструментом для Android, который принимает png как вход, масштабирует его для нескольких плотностей и сохраняет их в каталоге. (Проект, который можно найти здесь: https://code.google.com/p/9patch-resizer/Работа с weird png-8 с ImageIO

Для того, чтобы открыть изображения, я использую функцию readImage ImageIO в (http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html#read(java.io.File))

Но я возникли некоторые проблемы с некоторыми PNG 8-файлов, которые я сжался до минимального размера благодаря ImageOptim

дело в том, если я открываю этот файл с ImageIO, он отбрасывает информацию о прозрачности, и это раздражает. (Значение, когда я масштабировать его, и сохранить его позже, прозрачность отбрасывается)

Вот изображение, о котором я говорю:и пересчитывается выход: rescaled background

Если я использую метод createImage Инструментов (http://docs.oracle.com/javase/6/docs/api/java/awt/Toolkit.html#createImage(java.lang.String)) вместо метода ImageIO, чтобы получить изображение, он работает правильно, но я не получить информацию, такие как цвет модели и т.д. ...

+0

Просто обезжиренное исходный код для 'com.sun.imageio.plugins.png.PNGImageReader', и от того, что я могу понять, он просто не полностью поддерживает блок tRNS для PNG RGB (т. е. нет прозрачности) ... Тем не менее, он доступен через «IIOMetadata», поэтому вы можете читать, масштабировать, затем, наконец, записывать изображение вместе с метаданными из оригинала. – haraldK

+0

Hum, возможно, он не работает должным образом, поскольку я затем преобразовываю изображения, прежде чем писать их ... – Redwarp

+0

Ну, я думаю, что это может не сработать, потому что процесс: открыть изображения. Если они RGB или индексированный цвет, преобразуйте их в ARGB. Затем выполните некоторые изменения размера/модификации. И выписать некоторые png (в текущем состоянии программы, я пишу png-24, а не png-8, даже если вход png-8). И блок tRNS используется в PNG-8, а не 24. Так что использование этого не получится. – Redwarp

ответ

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(); 
     } 
    } 
} 
+0

Nice. То, что я пытаюсь сделать, - это открыть изображение. если это индексированное цветное изображение, преобразуйте его в argb, измените его размер, создайте новую индексированную цветовую карту, соответствующую новому создаваемому изображению, если индекс был проиндексирован, а затем сохраните его. Для масштабирования я использую следующий алгоритм: https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html (многоступенчатый билинейный, он дает хороший результат) – Redwarp

+0

Делает смысл. Вы можете найти мой «ResampleOp» [здесь] (https://github.com/haraldk/TwelveMonkeys/tree/master/common/common-image/src/main/java/com/twelvemonkeys/image) вместе с редуктором цвета/квантователь и фильтр диффузии ошибок. Это довольно старый код, но он выполняет эту работу, и вы можете найти его полезным. :-) – haraldK

+0

И фильтр сглаживания тоже? Звучит полезно! – Redwarp

Смежные вопросы