public class MainClass { public static void main(String[] args) throws Exception { byte ff = (byte) 0xff; byte[] r = { ff, 0, 0, ff, 0 }; byte[] g = { 0, ff, 0, ff, 0 }; byte[] b = { 0, 0, ff, ff, 0 };
ColorModel cm = new IndexColorModel(3, 5, r, g, b);
Color[] colors = { new Color(255, 0, 0), new Color(0, 255, 0), new Color(0, 0, 255)};
for (int i = 0; i " + ((byte[]) pixel)[0]);
}
for (byte i = 0; i unnormalized components"); for (int j = 0; j
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;
public Mandelbrot2(int width, int height) {
// Initialize with default location
this(width, height, new Rectangle2D.Float(-2.0f, -1.2f, 3.2f, 2.4f));
}
// 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);
}
}
}
}
publicstatic 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;
}
publicstatic 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 = newint[icm.getMapSize()];
icm.getRGBs(cmap); int color = 0xFF000000; int i; for(i=0; i!=cmap.length; ++i) if (cmap == color) break; if (i != cmap.length) {
cmap = 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 thrownew IllegalArgumentException("color not found");
} else thrownew IllegalArgumentException("not an IndexColorModel");
}
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) * h) / 8;
data = new byte[length];
DataBuffer db = new DataBufferByte(data, length);
WritableRaster wr = Raster.createPackedRaster(db, w, h, 1, null);
ColorModel cm = new IndexColorModel(1, 2, new byte[] { (byte) 0, (byte) 255 }, new byte[] {
(byte) 0, (byte) 255 }, new byte[] { (byte) 0, (byte) 255 });
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, 0, 0, this);
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.add(new StaticGenerator());
f.setSize(300, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}