code: package org.sunflow.image.writers;
  
  import java.io.BufferedOutputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  
  import org.sunflow.image.BitmapWriter;
  import org.sunflow.image.Color;
  import org.sunflow.image.XYZColor;
  
  /**
   * Writes images in Indigo's native XYZ format.
   * http://www2.indigorenderer.com/joomla/forum/viewtopic.php?p=11430
   */
  public class IGIBitmapWriter implements BitmapWriter {
      private String filename;
      private int width, height;
      private float[] xyz;
  
      public void configure(String option, String value) {
      }
  
      public void openFile(String filename) throws IOException {
          this.filename = filename;
      }
  
      public void writeHeader(int width, int height, int tileSize) throws IOException, UnsupportedOperationException {
          this.width = width;
          this.height = height;
          xyz = new float[width * height * 3];
      }
  
      public void writeTile(int x, int y, int w, int h, Color[] color, float[] alpha) throws IOException {
          for (int j = 0, index = 0, pixel = 3 * (x + y * width); j < h; j++, pixel += 3 * (width - w)) {
              for (int i = 0; i < w; i++, index++, pixel += 3) {
                  XYZColor c = Color.NATIVE_SPACE.convertRGBtoXYZ(color[index]);
                  xyz[pixel + 0] = c.getX();
                  xyz[pixel + 1] = c.getY();
                  xyz[pixel + 2] = c.getZ();
              }
          }
      }
  
      public void closeFile() throws IOException {
          OutputStream stream = new BufferedOutputStream(new FileOutputStream(filename));
          write32(stream, 66613373); // magic number
          write32(stream, 1); // version
          write32(stream, 0); // this should be a double - assume it won't be used
          write32(stream, 0);
          write32(stream, width);
          write32(stream, height);
          write32(stream, 1); // super sampling factor
          write32(stream, 0); // compression
          write32(stream, width * height * 12); // data size
          write32(stream, 0); // colorspace
          stream.write(new byte[5000]);
          for (float f : xyz)
              write32(stream, f);
          stream.close();
      }
  
      private static final void write32(OutputStream stream, int i) throws IOException {
          stream.write(i & 0xFF);
          stream.write((i >> 8) & 0xFF);
          stream.write((i >> 16) & 0xFF);
          stream.write((i >> 24) & 0xFF);
      }
  
      private static final void write32(OutputStream stream, float f) throws IOException {
          write32(stream, Float.floatToIntBits(f));
      }
  }