Package net.sourceforge.jiu.color.io

Source Code of net.sourceforge.jiu.color.io.PaletteSerialization

/*
* PaletteSerialization
*
* Copyright (c) 2001, 2002, 2003 Marco Schmidt.
* All rights reserved.
*/

package net.sourceforge.jiu.color.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Vector;
import net.sourceforge.jiu.codecs.ImageLoader;
import net.sourceforge.jiu.codecs.PNMCodec;
import net.sourceforge.jiu.data.MemoryRGB24Image;
import net.sourceforge.jiu.data.Palette;
import net.sourceforge.jiu.data.PixelImage;
import net.sourceforge.jiu.data.RGB24Image;
import net.sourceforge.jiu.data.RGBIndex;
import net.sourceforge.jiu.ops.OperationFailedException;

/**
* This class loads and saves palettes.
* Loading is done using the {@link ImageLoader} class - an image
* is loaded which is supposed to have no more than 256 pixels, the palette entries.
* When saving, the {@link PNMCodec} is used to store palettes as .ppm files.
*
* @author Marco Schmidt
* @since 0.5.0
*/
public class PaletteSerialization implements RGBIndex
{
  private PaletteSerialization()
  {
  }

  /**
   * Create a palette from the pixels of the argument image.
   */
  public static Palette convertImageToPalette(RGB24Image image)
  {
    if (image == null)
    {
      return null;
    }
    int numPixels = image.getWidth() * image.getHeight();
    if (numPixels > 256)
    {
      // too many pixels
      return null;
    }
    Palette result = new Palette(numPixels, 255);
    int index = 0;
    for (int y = 0; y < image.getHeight(); y++)
    {
      for (int x = 0; x < image.getWidth(); x++)
      {
        result.put(index++, image.getSample(INDEX_RED, x, y),
          image.getSample(INDEX_GREEN, x, y),
          image.getSample(INDEX_BLUE, x, y));
      }
    }
    return result;
  }

  /**
   * Creates an RGB24Image from the palette entries, each entry
   * becomes a pixel in an image of width 1 and height
   * palette.getNumEntries().
   */
  public static RGB24Image convertPaletteToImage(Palette palette)
  {
    RGB24Image result = new MemoryRGB24Image(1, palette.getNumEntries());
    for (int index = 0; index < palette.getNumEntries(); index++)
    {
      result.putSample(INDEX_RED, 0, index, palette.getSample(INDEX_RED, index));
      result.putSample(INDEX_GREEN, 0, index, palette.getSample(INDEX_GREEN, index));
      result.putSample(INDEX_BLUE, 0, index, palette.getSample(INDEX_BLUE, index));
    }
    return result;
  }

  /**
   * Loads a palette from the argument file.
   * Uses {@link net.sourceforge.jiu.codecs.ImageLoader} to load an
   * image from the argument file, then calls {@link #convertImageToPalette}
   * and returns the palette created that way.
   */
  public static Palette load(File paletteFile)
  {
    PixelImage image;
    try
    {
      image = ImageLoader.load(paletteFile, (Vector)null);
    }
    catch (Exception e)
    {
      return null;
    }
    if (!(image instanceof RGB24Image))
    {
      return null;
    }
    return convertImageToPalette((RGB24Image)image);
  }

  /**
   * Saves the palette to the given file as a PPM image file.
   * Uses {@link net.sourceforge.jiu.codecs.PNMCodec}.
   */
  public static void save(Palette palette, File paletteFile) throws
    IOException
  {
    RGB24Image image = convertPaletteToImage(palette);
    PNMCodec codec = new PNMCodec();
    codec.setOutputStream(new FileOutputStream(paletteFile));
    codec.setAscii(true);
    codec.setImage(image);
    try
    {
      codec.process();
    }
    catch(OperationFailedException ofe)
    {
      throw new IOException("I/O error: " + ofe.toString());
    }
  }
}
TOP

Related Classes of net.sourceforge.jiu.color.io.PaletteSerialization

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.