This is a minimal implementation of writing your own BufferedImage, using
artificial data. I thought others just getting started might find it useful.
It also shows two other ways of getting an Image, one using the original
Toolkit.createImage(), the second using the new ImageIO.read() method.
*********
package myImage;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.EventListenerList;
public class TestImage {
TestImage() {
JFrame frame = new JFrame("Test PrefPanel");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().setLayout(new FlowLayout());
// old way of getting image
Image im =
Toolkit.getDefaultToolkit().createImage("E:/dev/image/test.jpg");
MediaTracker tracker = new MediaTracker( frame);
tracker.addImage( im, 0);
try {
tracker.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println( "image error = "+ tracker.isErrorAny());
ImagePanel imp1 = new ImagePanel( "test", im);
frame.getContentPane().add(imp1);
// new jdk1.4 way using imageio
File f = new File("E:/dev/image/MiniBush.jpg");
BufferedImage bi = null;
try {
bi = javax.imageio.ImageIO.read(f);
} catch (Exception e) {
e.printStackTrace();
}
ImagePanel imp2 = new ImagePanel( "mini", bi);
frame.getContentPane().add(imp2);
// fake image
Image im3 = new FakeImage().getImage();
ImagePanel imp3 = new ImagePanel( "fake", im3);
frame.getContentPane().add(imp3);
frame.pack();
frame.setVisible(true);
frame.setBounds(new Rectangle(50, 50, 500, 500));
} // constructor
private class ImagePanel extends JPanel {
int w, h;
Image im;
String name;
ImagePanel(String name, Image im) {
this.name = name;
this.im = im;
w = im.getWidth( new myObs());
h = im.getHeight( new myObs());
}
public Dimension getPreferredSize() {
return new Dimension(w,h);
}
/** System-triggered redraw. */
public void paintComponent(Graphics g) {
g.drawImage( im, 0, 0, new myObs());
}
}
// necessary for g.drawImage()
private class myObs implements java.awt.image.ImageObserver {
public boolean imageUpdate(Image image, int flags, int x, int y, int
width, int height) {
return true;
}
}
class FakeImage {
private BufferedImage image;
FakeImage() {
SampleModel model = new FakeSampleModel( DataBuffer.TYPE_INT, 100,
100);
DataBuffer data = model.createDataBuffer();
WritableRaster raster = Raster.createWritableRaster( model, data,
null);
ColorModel colorModel = new FakeColorModel();
image = new BufferedImage( colorModel, raster, false, null);
}
Image getImage() { return image; }
}
class FakeSampleModel extends java.awt.image.SampleModel {
FakeSampleModel(int type, int w, int h) {
super(type, w, h, 1);
}
public int getNumDataElements() { return 1; }
public Object getDataElements(int x, int y, Object obj, DataBuffer data)
{
int[] idata;
if (obj == null)
idata = new int[1];
else
idata = (int[])obj;
idata[0] = data.getElem( x * y);
return idata;
}
public void setDataElements(int x, int y, Object obj, DataBuffer data)
{ }
public int getSample(int x, int y, int b, DataBuffer data) {
return data.getElem( x * y);
}
public void setSample(int x, int y, int b, int s, DataBuffer data) { }
public SampleModel createCompatibleSampleModel(int w, int h) {
return new FakeSampleModel(getDataType(), w, h);
}
public SampleModel createSubsetSampleModel(int bands[]) {
return new FakeSampleModel(getDataType(), getWidth(), getHeight());
}
public DataBuffer createDataBuffer() {
return new FakeDataBuffer(getDataType(), getWidth() * getHeight());
}
public int[] getSampleSize() {
int[] s = new int[1];
s[0] = 32;
return s;
}
public int getSampleSize(int band) {
return 32;
}
}
class FakeDataBuffer extends java.awt.image.DataBuffer {
FakeDataBuffer(int type, int size) { super( type, size); }
public int getElem(int bank, int i) { return (i > 3333) ? 0 : 255; }
public void setElem(int bank, int i, int val) { }
}
class FakeColorModel extends java.awt.image.ColorModel {
FakeColorModel() { super(32); }
public int getRed(int pixel) { return pixel; }
public int getGreen(int pixel) { return pixel; }
public int getBlue(int pixel) { return pixel; }
public int getAlpha(int pixel) { return 255; }
public boolean isCompatibleRaster(Raster raster) {
return raster.getSampleModel() instanceof FakeSampleModel;
}
public ColorModel coerceData (WritableRaster raster, boolean isap) {
return this; }
}
/** test */
public static void main(String args[]) {
new TestImage();
} // main
}
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".