gt: 	    String[] iioFormats = ImageIO.getWriterFormatNames();
context: /*
   * (c) 2013-2017 Jens Mueller
   *
   * Kleincomputer-Emulator
   *
   * Speichern von Bildern
   */
  
  package jkcemu.image;
  
  import java.awt.Component;
  import java.awt.Frame;
  import java.awt.image.BufferedImage;
  import java.awt.image.IndexColorModel;
  import java.awt.Transparency;
  import java.io.ByteArrayOutputStream;
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.lang.*;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.SortedSet;
  import java.util.TreeSet;
  import javax.imageio.ImageIO;
  import jkcemu.Main;
  import jkcemu.base.BaseDlg;
  import jkcemu.base.EmuMemView;
  import jkcemu.base.EmuUtil;
  import jkcemu.base.FileFormat;
  import jkcemu.base.FileSaver;
  
  
  public class ImgSaver
  {
    private static final byte[] ac1AccAppMemBytes = {
  	(byte) 0x31, (byte) 0x00, (byte) 0x20, (byte) 0x21,
  	(byte) 0x20, (byte) 0x20, (byte) 0x11, (byte) 0x00,
  	(byte) 0x10, (byte) 0x01, (byte) 0x00, (byte) 0x08,
  	(byte) 0xED, (byte) 0xB0, (byte) 0xCD, (byte) 0xFA,
  	(byte) 0x07, (byte) 0xE6, (byte) 0x7F, (byte) 0x28,
  	(byte) 0xF9, (byte) 0xCD, (byte) 0x08, (byte) 0x00,
  	(byte) 0x3E, (byte) 0x0C, (byte) 0xCD, (byte) 0x10,
  	(byte) 0x00, (byte) 0xC3, (byte) 0xFD, (byte) 0x07 };
  
    private static final byte[] ac1ScchAppMemBytes = {
  	(byte) 0x31, (byte) 0x00, (byte) 0x20, (byte) 0x21,
  	(byte) 0x1D, (byte) 0x20, (byte) 0x11, (byte) 0x00,
  	(byte) 0x10, (byte) 0x01, (byte) 0x00, (byte) 0x08,
  	(byte) 0xED, (byte) 0xB0, (byte) 0xCD, (byte) 0xFA,
  	(byte) 0x07, (byte) 0xE6, (byte) 0x7F, (byte) 0x28,
  	(byte) 0xF9, (byte) 0x3E, (byte) 0x0C, (byte) 0xCD,
  	(byte) 0x10, (byte) 0x00, (byte) 0xC3, (byte) 0xFD,
  	(byte) 0x07 };
  
    private static final byte[] kc852BWAppMemBytes = {
  	(byte) 0x7F, (byte) 0x7F, (byte) 0x53, (byte) 0x48,
  	(byte) 0x4F, (byte) 0x57, (byte) 0x49, (byte) 0x4D,
  	(byte) 0x47, (byte) 0x01, (byte) 0xDB, (byte) 0x88,
  	(byte) 0xF5, (byte) 0xF6, (byte) 0x04, (byte) 0xD3,
  	(byte) 0x88, (byte) 0x11, (byte) 0x58, (byte) 0x03,
  	(byte) 0x21, (byte) 0x00, (byte) 0x80, (byte) 0xCD,
  	(byte) 0x3A, (byte) 0x03, (byte) 0x21, (byte) 0x00,
  	(byte) 0xA8, (byte) 0x3E, (byte) 0x07, (byte) 0x0E,
  	(byte) 0x0A, (byte) 0x06, (byte) 0x00, (byte) 0x77,
  	(byte) 0x23, (byte) 0x10, (byte) 0xFC, (byte) 0x0D,
  	(byte) 0x20, (byte) 0xF7, (byte) 0xCD, (byte) 0x03,
  	(byte) 0xF0, (byte) 0x0E, (byte) 0x30, (byte) 0xFA,
  	(byte) 0xF1, (byte) 0xD3, (byte) 0x88, (byte) 0x3E,
  	(byte) 0x0C, (byte) 0xCD, (byte) 0x03, (byte) 0xF0,
  	(byte) 0x00, (byte) 0xC9, (byte) 0x1A, (byte) 0x13,
  	(byte) 0xFE, (byte) 0x80, (byte) 0xC8, (byte) 0x38,
  	(byte) 0x0D, (byte) 0x47, (byte) 0x3E, (byte) 0x01,
  	(byte) 0x90, (byte) 0x47, (byte) 0x1A, (byte) 0x13,
  	(byte) 0x77, (byte) 0x23, (byte) 0x10, (byte) 0xFC,
  	(byte) 0x18, (byte) 0xEC, (byte) 0x3C, (byte) 0x47,
  	(byte) 0x1A, (byte) 0x13, (byte) 0x77, (byte) 0x23,
  	(byte) 0x10, (byte) 0xFA, (byte) 0x18, (byte) 0xE2 };
  
    private static final byte[] kc854HiresAppMemBytes = {
  	(byte) 0x7F, (byte) 0x7F, (byte) 0x53, (byte) 0x48,
  	(byte) 0x4F, (byte) 0x57, (byte) 0x49, (byte) 0x4D,
  	(byte) 0x47, (byte) 0x01, (byte) 0xDB, (byte) 0x88,
  	(byte) 0xF5, (byte) 0xF6, (byte) 0x04, (byte) 0xD3,
  	(byte) 0x88, (byte) 0xDD, (byte) 0x7E, (byte) 0x01,
  	(byte) 0xF5, (byte) 0xE6, (byte) 0xF1, (byte) 0xEE,
  	(byte) 0x01, (byte) 0x28, (byte) 0x02, (byte) 0xF6,
  	(byte) 0x04, (byte) 0xD3, (byte) 0x84, (byte) 0xDD,
  	(byte) 0x77, (byte) 0x01, (byte) 0xF5, (byte) 0x11,
  	(byte) 0x68, (byte) 0x03, (byte) 0x21, (byte) 0x00,
  	(byte) 0x80, (byte) 0xCD, (byte) 0x4A, (byte) 0x03,
  	(byte) 0xF1, (byte) 0xF6, (byte) 0x02, (byte) 0xD3,
  	(byte) 0x84, (byte) 0xDD, (byte) 0x77, (byte) 0x01,
  	(byte) 0x21, (byte) 0x00, (byte) 0x80, (byte) 0xCD,
  	(byte) 0x4A, (byte) 0x03, (byte) 0xCD, (byte) 0x03,
  	(byte) 0xF0, (byte) 0x0E, (byte) 0x30, (byte) 0xFA,
  	(byte) 0xF1, (byte) 0xD3, (byte) 0x84, (byte) 0xDD,
  	(byte) 0x77, (byte) 0x01, (byte) 0xF1, (byte) 0xD3,
  	(byte) 0x88, (byte) 0xC9, (byte) 0x1A, (byte) 0x13,
  	(byte) 0xFE, (byte) 0x80, (byte) 0xC8, (byte) 0x38,
  	(byte) 0x0D, (byte) 0x47, (byte) 0x3E, (byte) 0x01,
  	(byte) 0x90, (byte) 0x47, (byte) 0x1A, (byte) 0x13,
  	(byte) 0x77, (byte) 0x23, (byte) 0x10, (byte) 0xFC,
  	(byte) 0x18, (byte) 0xEC, (byte) 0x3C, (byte) 0x47,
  	(byte) 0x1A, (byte) 0x13, (byte) 0x77, (byte) 0x23,
  	(byte) 0x10, (byte) 0xFA, (byte) 0x18, (byte) 0xE2 };
  
    private static final byte[] kc854LowresBWAppMemBytes = {
  	(byte) 0x7F, (byte) 0x7F, (byte) 0x53, (byte) 0x48,
  	(byte) 0x4F, (byte) 0x57, (byte) 0x49, (byte) 0x4D,
  	(byte) 0x47, (byte) 0x01, (byte) 0xDB, (byte) 0x88,
  	(byte) 0xF5, (byte) 0xF6, (byte) 0x04, (byte) 0xD3,
  	(byte) 0x88, (byte) 0xDD, (byte) 0x7E, (byte) 0x01,
  	(byte) 0xF5, (byte) 0xE6, (byte) 0xF1, (byte) 0xF6,
  	(byte) 0x08, (byte) 0xEE, (byte) 0x01, (byte) 0x28,
  	(byte) 0x02, (byte) 0xF6, (byte) 0x04, (byte) 0xD3,
  	(byte) 0x84, (byte) 0xDD, (byte) 0x77, (byte) 0x01,
  	(byte) 0xF5, (byte) 0x11, (byte) 0x74, (byte) 0x03,
  	(byte) 0x21, (byte) 0x00, (byte) 0x80, (byte) 0xCD,
  	(byte) 0x56, (byte) 0x03, (byte) 0xF1, (byte) 0xF6,
  	(byte) 0x02, (byte) 0xD3, (byte) 0x84, (byte) 0xDD,
  	(byte) 0x77, (byte) 0x01, (byte) 0x21, (byte) 0x00,
  	(byte) 0x80, (byte) 0x3E, (byte) 0x07, (byte) 0x0E,
  	(byte) 0x28, (byte) 0x06, (byte) 0x00, (byte) 0x77,
  	(byte) 0x23, (byte) 0x10, (byte) 0xFC, (byte) 0x0D,
  	(byte) 0x20, (byte) 0xF7, (byte) 0xCD, (byte) 0x03,
  	(byte) 0xF0, (byte) 0x0E, (byte) 0x30, (byte) 0xFA,
  	(byte) 0xF1, (byte) 0xD3, (byte) 0x84, (byte) 0xDD,
  	(byte) 0x77, (byte) 0x01, (byte) 0xF1, (byte) 0xD3,
  	(byte) 0x88, (byte) 0xC9, (byte) 0x1A, (byte) 0x13,
  	(byte) 0xFE, (byte) 0x80, (byte) 0xC8, (byte) 0x38,
  	(byte) 0x0D, (byte) 0x47, (byte) 0x3E, (byte) 0x01,
  	(byte) 0x90, (byte) 0x47, (byte) 0x1A, (byte) 0x13,
  	(byte) 0x77, (byte) 0x23, (byte) 0x10, (byte) 0xFC,
  	(byte) 0x18, (byte) 0xEC, (byte) 0x3C, (byte) 0x47,
  	(byte) 0x1A, (byte) 0x13, (byte) 0x77, (byte) 0x23,
  	(byte) 0x10, (byte) 0xFA, (byte) 0x18, (byte) 0xE2 };
  
    private static final byte[] llc2HiresAppMemBytes = {
  	(byte) 0x31, (byte) 0x00, (byte) 0x20, (byte) 0x11,
  	(byte) 0x39, (byte) 0x20, (byte) 0x21, (byte) 0x00,
  	(byte) 0x80, (byte) 0x1A, (byte) 0x13, (byte) 0xFE,
  	(byte) 0x80, (byte) 0x28, (byte) 0x19, (byte) 0x38,
  	(byte) 0x0D, (byte) 0x47, (byte) 0x3E, (byte) 0x01,
  	(byte) 0x90, (byte) 0x47, (byte) 0x1A, (byte) 0x13,
  	(byte) 0x77, (byte) 0x23, (byte) 0x10, (byte) 0xFC,
  	(byte) 0x18, (byte) 0xEB, (byte) 0x3C, (byte) 0x47,
  	(byte) 0x1A, (byte) 0x13, (byte) 0x77, (byte) 0x23,
  	(byte) 0x10, (byte) 0xFA, (byte) 0x18, (byte) 0xE1,
  	(byte) 0x3E, (byte) 0x50, (byte) 0xD3, (byte) 0xEE,
  	(byte) 0xCD, (byte) 0xFA, (byte) 0x07, (byte) 0xE6,
  	(byte) 0x7F, (byte) 0x28, (byte) 0xF9, (byte) 0xAF,
  	(byte) 0xD3, (byte) 0xEE, (byte) 0xC3, (byte) 0xFD,
  	(byte) 0x07 };
  
    private static final byte[] z1013AppMemBytes = {
  	(byte) 0x21, (byte) 0x16, (byte) 0x01, (byte) 0x11,
  	(byte) 0x00, (byte) 0xEC, (byte) 0x01, (byte) 0x00,
  	(byte) 0x04, (byte) 0xED, (byte) 0xB0, (byte) 0xE7,
  	(byte) 0x01, (byte) 0x00, (byte) 0x3E, (byte) 0x0C,
  	(byte) 0xE7, (byte) 0x00, (byte) 0x00, (byte) 0xC3,
  	(byte) 0x38, (byte) 0x00 };
  
    private static final byte[] z9001AppMemBytes = {
  	(byte) 0xC3, (byte) 0x0D, (byte) 0x03, (byte) 0x56,
  	(byte) 0x49, (byte) 0x45, (byte) 0x57, (byte) 0x49,
  	(byte) 0x4D, (byte) 0x47, (byte) 0x20, (byte) 0x00,
  	(byte) 0x00, (byte) 0x0E, (byte) 0x1D, (byte) 0xCD,
  	(byte) 0x05, (byte) 0x00, (byte) 0x21, (byte) 0x00,
  	(byte) 0xE8, (byte) 0x36, (byte) 0x70, (byte) 0x11,
  	(byte) 0x01, (byte) 0xE8, (byte) 0x01, (byte) 0xBF,
  	(byte) 0x04, (byte) 0xED, (byte) 0xB0, (byte) 0x21,
  	(byte) 0x3E, (byte) 0x03, (byte) 0x11, (byte) 0x00,
  	(byte) 0xEC, (byte) 0x01, (byte) 0xC0, (byte) 0x03,
  	(byte) 0xED, (byte) 0xB0, (byte) 0x0E, (byte) 0x01,
  	(byte) 0xCD, (byte) 0x05, (byte) 0x00, (byte) 0x0E,
  	(byte) 0x1E, (byte) 0xCD, (byte) 0x05, (byte) 0x00,
  	(byte) 0x1E, (byte) 0x0C, (byte) 0x0E, (byte) 0x02,
  	(byte) 0xCD, (byte) 0x05, (byte) 0x00, (byte) 0xC3,
  	(byte) 0x00, (byte) 0x00 };
  
    private static final byte[] kcUnpackBytes = {
  	(byte) 0x21, (byte) 0x1E, (byte) 0x40, (byte) 0x11,
  	(byte) 0x00, (byte) 0x80, (byte) 0x3E, (byte) 0xA8,
  	(byte) 0xBA, (byte) 0xC8, (byte) 0x7E, (byte) 0x23,
  	(byte) 0xFE, (byte) 0x1B, (byte) 0x28, (byte) 0x04,
  	(byte) 0x12, (byte) 0x13, (byte) 0x18, (byte) 0xF2,
  	(byte) 0x7E, (byte) 0x23, (byte) 0x46, (byte) 0x23,
  	(byte) 0x12, (byte) 0x13, (byte) 0x10, (byte) 0xFC,
  	(byte) 0x18, (byte) 0xE8 };
  
  
    public static void saveAppAC1ACC(
  			byte[] videoMemBytes,
  			File   file ) throws IOException
    {
      saveApp( file, false, 0x2000, ac1AccAppMemBytes, videoMemBytes );
    }
  
  
    public static void saveAppAC1SCCH(
  			byte[] videoMemBytes,
  			File   file ) throws IOException
    {
      saveApp( file, false, 0x2000, ac1ScchAppMemBytes, videoMemBytes );
    }
  
  
    public static void saveAppKC852BW(
  			BufferedImage image,
  			File          file ) throws IOException
    {
      byte[] pixelIRM = new byte[ ImgUtil.KC85_COLS * ImgUtil.KC85_H ];
      ImgUtil.createKC852MonochromeMemBytes( image, pixelIRM );
  
      byte[] packedPixels = ImgUtil.toPackBits( pixelIRM );
      if( packedPixels != null ) {
        if( packedPixels.length > 0 ) {
  	saveApp(
  		file,
  		false,
  		0x0300,
  		kc852BWAppMemBytes,
  		packedPixels );
        }
      }
    }
  
  
    public static void saveAppKC854Hires(
  			BufferedImage image,
  			File          file ) throws IOException
    {
      byte[] pixelIRM = new byte[ ImgUtil.KC85_COLS * ImgUtil.KC85_H ];
      byte[] colorIRM = new byte[ ImgUtil.KC85_COLS * ImgUtil.KC85_H ];
      ImgUtil.createKC854HiresMemBytes( image, pixelIRM, colorIRM );
  
      byte[] packedPixels = ImgUtil.toPackBits( pixelIRM );
      byte[] packedColors = ImgUtil.toPackBits( colorIRM );
      if( (packedPixels != null) && (packedColors != null) ) {
        if( (packedPixels.length > 0) && (packedColors.length > 0) ) {
  	saveApp(
  		file,
  		false,
  		0x0300,
  		kc854HiresAppMemBytes,
  		packedPixels,
  		packedColors );
        }
      }
    }
  
  
    public static void saveAppKC854LowresBW(
  			BufferedImage image,
  			File          file ) throws IOException
    {
      byte[] pixelIRM = new byte[ ImgUtil.KC85_COLS * ImgUtil.KC85_H ];
      ImgUtil.createKC854MonochromeMemBytes( image, pixelIRM );
  
      byte[] packedPixels = ImgUtil.toPackBits( pixelIRM );
      if( packedPixels != null ) {
        if( packedPixels.length > 0 ) {
  	saveApp(
  		file,
  		false,
  		0x0300,
  		kc854LowresBWAppMemBytes,
  		packedPixels );
        }
      }
    }
  
  
    public static void saveAppLLC2Hires(
  			byte[] videoMemBytes,
  			File   file ) throws IOException
    {
      byte[] packedBytes = ImgUtil.toPackBits( videoMemBytes );
      if( packedBytes != null ) {
        if( packedBytes.length > 0 ) {
  	saveApp( file, false, 0x2000, llc2HiresAppMemBytes, packedBytes );
        }
      }
    }
  
  
    public static void saveAppZ1013(
  			byte[] videoMemBytes,
  			File   file ) throws IOException
    {
      saveApp( file, true, 0x0100, z1013AppMemBytes, videoMemBytes );
    }
  
  
    public static void saveAppZ9001(
  			byte[] videoMemBytes,
  			File   file ) throws IOException
    {
      saveApp( file, true, 0x0300, z9001AppMemBytes, videoMemBytes );
    }
  
  
    public static File saveImageAs(
  			Frame         owner,
  			BufferedImage image,
  			File          presetFile )
    {
      boolean         monochrome = false;
      IndexColorModel icm        = ImgUtil.getIndexColorModel( image );
      if( icm != null ) {
        if( icm.getMapSize() == 2 ) {
  	monochrome = true;
        }
      }
      if( presetFile == null ) {
        presetFile = Main.getLastDirFile( Main.FILE_GROUP_IMAGE );
      }
      File file = EmuUtil.showFileSaveDlg(
  				owner,
  				"Bilddatei speichern",
  				presetFile,
  				createFileFilters( monochrome ) );
      if( file != null ) {
        try {
  	if( IFFFile.accept( file ) ) {
  	  IFFFile.writeImage( file, image );
  	  Main.setLastFile( file, Main.FILE_GROUP_IMAGE );
  	} else {
  
  	  /*
  	   * Speichern ueber ImageIO
  	   *
  	   * Dazu muss zuerst das Grafikformat ermittelt werden.
  	   */
  	  String fName = file.getName();
  	  if( fName != null ) {
  	    String   lowerName  = fName.toLowerCase();
  	    String   usedFmt    = null;
  