import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;

public class Test {
	public static void main(String[] args) {
		if (args.length != 2) {
			System.out.println("Provide input and output files as parameters");
			return;
		}

		String inputFile = args[0];
		String outputFile = args[1];

		try (InputStream input = new FileInputStream(inputFile);
				OutputStream output = new FileOutputStream(outputFile);) {
			ImageInputStream imageInputStream = ImageIO.createImageInputStream(input);
			Iterator<ImageReader> imageReader = ImageIO.getImageReaders(imageInputStream);
			IIOImage image = null;
			if (imageReader.hasNext()) {
				ImageReader reader = imageReader.next();
				reader.setInput(imageInputStream, true);
				IIOMetadata metadata = reader.getImageMetadata(0);
				BufferedImage bufferedImage = reader.read(0);
				Iterator<ImageWriter> imageWriter = ImageIO.getImageWritersByFormatName("png");
				ImageWriter writer = imageWriter.next();

				image = new IIOImage(bufferedImage, null, metadata);
				ImageOutputStream ios = ImageIO.createImageOutputStream(output);
				writer.setOutput(ios);
				writer.write(reader.getStreamMetadata(), image, null);
				ios.flush();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
