Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1471724
  • 博文数量: 254
  • 博客积分: 8696
  • 博客等级: 中将
  • 技术积分: 2961
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-03 16:46
文章分类

全部博文(254)

文章存档

2015年(4)

2014年(18)

2013年(16)

2012年(8)

2011年(25)

2010年(2)

2009年(74)

2008年(107)

分类: Java

2009-08-25 19:58:32

以下ColorModel例子,均从网络收集,部分未测试过,见谅。
ColorModel: getComponents(int pixel, int[] components, int offset)
 
import java.awt.Color;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;

public class MainClass {
  public static void main(String[] argsthrows Exception {
    byte ff = (byte0xff;
    byte[] r = ff, 00, ff, };
    byte[] g = 0, ff, 0, ff, };
    byte[] b = 00, ff, ff, };

    ColorModel cm = new IndexColorModel(35, r, g, b);

    Color[] colors = new Color(25500)new Color(02550)new Color(00255)};

    for (int i = 0; i < colors.length; i++) {
      int rgb = colors[i].getRGB();
      Object pixel = cm.getDataElements(rgb, null);
      System.out.println(colors[i" -> " ((byte[]) pixel)[0]);
    }

    for (byte i = 0; i < 5; i++) {
      int[] unnormalizedComponents = cm.getComponents(i, null, 0);
      System.out.print(i + " -> unnormalized components");
      for (int j = 0; j < unnormalizedComponents.length; j++)
        System.out.print(" " + unnormalizedComponents[j]);
      System.out.println();
    }
  }
}

 

Creating a Buffered Image from an Array of Color-Indexed Pixel Values

(出自:http://www.exampledepot.com/egs/java.awt.image/Mandelbrot2.html)

This example demonstrates how to convert a byte array of pixel values that are indices to a color table into a BufferedImage. In particular, the example generates the Mandelbrot set in a byte buffer and combines this data with a SampleModel, ColorModel, and Raster into a BufferedImage. A 16-color index color model is used to represent the pixel colors.

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    
    // Instantiate this class and then use the draw() method to draw the
    // generated on the graphics context.
    public class Mandelbrot2 {
        // Holds the generated image
        Image image;
    
        // 16-color model; this method is defined in
        // e660 Creating an Image from an Array of Color-Indexed Pixel Values
        ColorModel colorModel = generateColorModel();
    
        public Mandelbrot2(int width, int height) {
            // Initialize with default location
            this(width, height, new Rectangle2D.Float(-2.0f, -1.2f, 3.2f, 2.4f));
        }
    
        public Mandelbrot2(int width, int height, Rectangle2D.Float loc) {
            // Generate the pixel data; this method is defined in
            // e660 Creating an Image from an Array of Color-Indexed Pixel Values
            byte[] pixels = generatePixels(width, height, loc);
    
            // Create a data buffer using the byte buffer of pixel data.
            // The pixel data is not copied; the data buffer uses the byte buffer array.
            DataBuffer dbuf = new DataBufferByte(pixels, width*height, 0);
    
            // The number of banks should be 1
            int numBanks = dbuf.getNumBanks(); // 1
    
            // Prepare a sample model that specifies a storage 4-bits of
            // pixel datavd in an 8-bit data element
            int bitMasks[] = new int[]{(byte)0xf};
            SampleModel sampleModel = new SinglePixelPackedSampleModel(
                DataBuffer.TYPE_BYTE, width, height, bitMasks);
    
            // Create a raster using the sample model and data buffer
            WritableRaster raster = Raster.createWritableRaster(sampleModel, dbuf, null);
    
            // Combine the color model and raster into a buffered image
            image = new BufferedImage(colorModel, raster, false, null);//new java.util.Hashtable());
        }
    
        public void draw(Graphics g, int x, int y) {
            g.drawImage(image, x, y, null);
        }
    }

Here's some code that uses the Mandelbrot2 class:

    class RunMandelbrot2 {
        static public void main(String[] args) {
            new RunMandelbrot2();
        }
        RunMandelbrot2() {
            Frame frame = new Frame("Mandelbrot2 Set");
            frame.add(new MyCanvas());
            frame.setSize(300, 200) ;
            frame.setVisible(true);
        }
    
        class MyCanvas extends Canvas {
            Mandelbrot2 mandelbrot;
    
            MyCanvas() {
                // Add a listener for resize events
                addComponentListener(new ComponentAdapter() {
                    // This method is called when the component's size changes
                    public void componentResized(ComponentEvent evt) {
                        Component c = (Component)evt.getSource();
    
                        // Get new size
                        Dimension newSize = c.getSize();
    
                        // Regenerate the image
                        mandelbrot = new Mandelbrot2(newSize.width, newSize.height);
                        c.repaint();
                    }
                });
            }
    
            public void paint(Graphics g) {
                if (mandelbrot != null) {
                    mandelbrot.draw(g, 0, 0);
                }
            }
        }
    }
 
Convert to BufferedImage with IndexColorModel   
(出自:)
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
 
public class ColorModelConvert {
    public static void main(String[] args) {
        BufferedImage image0 = toTransparent(toICM(createSample("icm alias", true, true)));
        BufferedImage image1 = toTransparent(toICM(createSample("icm", true, false)));
        BufferedImage image2 = toTransparent(toICM(createSample("!icm alias", false, true)));
        BufferedImage image3 = toTransparent(toICM(createSample("!icm", false, false)));
        display(image0, image1, image2, image3);
    }
 
    public static BufferedImage createSample(String text, boolean index, boolean alias) {
        //opaque:
        BufferedImage result = new BufferedImage(450, 150,
            index ? BufferedImage.TYPE_BYTE_INDEXED : BufferedImage.TYPE_INT_RGB);
        Graphics2D g = result.createGraphics();
        if (alias) {
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        }
        g.setPaint(Color.BLUE);
        g.fillOval(100,25,100,100);
        g.setPaint(Color.RED);
        g.setFont(new Font("Lucida Bright", Font.PLAIN, 96));
        g.drawString(text, 10, 90);
        g.dispose();
        return result;
    }
 
    public static BufferedImage toICM(BufferedImage image) {
        if (!(image.getColorModel() instanceof IndexColorModel)) {
            //This new BI is always opaque
            int w = image.getWidth(), h = image.getHeight();
            BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED);
            Graphics2D g = result.createGraphics();
            //doesn't seem to work: :-(
            g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
            g.drawRenderedImage(image, null);
            g.dispose();
            image.flush();
            return result;
        } else
            return image;
    }
 
    //black to transparent
    static BufferedImage toTransparent(BufferedImage image) {
        ColorModel cm = image.getColorModel();
        if (cm instanceof IndexColorModel) {
            IndexColorModel icm = (IndexColorModel) cm;
            int[] cmap = new int[icm.getMapSize()];
            icm.getRGBs(cmap);
            int color = 0xFF000000;
            int i;
            for(i=0; i!=cmap.length; ++i)
                if (cmap[i] == color)
                    break;
            if (i != cmap.length) {
                cmap[i] = 0; //transparent
                IndexColorModel newicm = new IndexColorModel(8, cmap.length, cmap,
                    0, true, Transparency.BITMASK, DataBuffer.TYPE_BYTE);
                BufferedImage result = new BufferedImage(newicm, image.getRaster(), false, null);
                image.flush();
                return result;
            } else
                throw new IllegalArgumentException("color not found");
        } else
            throw new IllegalArgumentException("not an IndexColorModel");
    }
 
    public static void display(BufferedImage image0, BufferedImage image1,
        BufferedImage image2, BufferedImage image3) {
        JPanel panel = new JPanel(new GridLayout(0,1));
        panel.add(createLabel(image0));
        panel.add(createLabel(image1));
        panel.add(createLabel(image2));
        panel.add(createLabel(image3));
 
        JFrame f = new JFrame("ColorModelConvert");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(panel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
 
    public static JLabel createLabel(BufferedImage image) {
        JLabel label = new JLabel(new ImageIcon(image));
        label.setOpaque(true);
        label.setBackground(Color.WHITE);
        label.setBorder(BorderFactory.createEtchedBorder());
        return label;
    }
}

 

Noise Image

(出自:)

import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.IndexColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.util.Random;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class StaticGenerator extends JComponent implements Runnable {
  byte[] data;

  BufferedImage image;

  Random random;

  public void initialize() {
    int w = getSize().width, h = getSize().height;
    int length = ((w + 7* h8;
    data = new byte[length];
    DataBuffer db = new DataBufferByte(data, length);
    WritableRaster wr = Raster.createPackedRaster(db, w, h, 1null);
    ColorModel cm = new IndexColorModel(12new byte[] { (byte0(byte255 }new byte[] {
        (byte0(byte255 }new byte[] { (byte0(byte255 });
    image = new BufferedImage(cm, wr, false, null);
    random = new Random();
    new Thread(this).start();
  }

  public void run() {
    while (true) {
      random.nextBytes(data);
      repaint();
      try {
        Thread.sleep(1000 24);
      catch (InterruptedException e) { /* die */
      }
    }
  }

  public void paint(Graphics g) {
    if (image == null)
      initialize();
    g.drawImage(image, 00this);
  }

  public static void main(String[] args) {
    JFrame f = new JFrame();
    f.add(new StaticGenerator());
    f.setSize(300300);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}



阅读(3164) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~