If I do this to get the pixels from an image for later rendering in a
MemoryImageSource my applet runs fine.
width = image.getWidth(canvas);
height = image.getHeight(canvas);
pixels = new int [width * height ];
int cnt = 0;
pg = new PixelGrabber(image,0,0,width,height,pixels,0,width);
try
{
while (pg.grabPixels(0) != true)
{
Thread.yield();
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0)
{
System.err.println("Image fetch aborted or errored...");
}
}
If I do this -- then the applet becomes sluggish to the point
of not being usable.
int [] pixels = null;
try
{
ImageInputStream iis = ImageIO.createImageInputStream(new
ByteArrayInputStream(imageBuffer));
Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = (ImageReader)readers.next();
ImageReadParam param = reader.getDefaultReadParam();
bi = new BufferedImage(1024,1024,BufferedImage.TYPE_INT_RGB);
param.setDestination(bi);
reader.setInput(iis, true);
bi = reader.read(0,param);
width = bi.getWidth();
height = bi.getHeight();
pixels =
((DataBufferInt)(bi.getRaster().getDataBuffer())).getData();
}
Does this have something to do with the way integer arrays
are stored? Is there indirection involved somewhere.
I've attached my entire class file for your inspection.
===========================================================================
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".
package pantile;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.color.ColorSpace;
import java.awt.image.DataBufferInt;
import java.awt.image.PixelGrabber;
import java.awt.image.ImageObserver;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.image.BufferedImage;
public class PanTileImageFetch implements Runnable
{
private URL imageURL = null;
private PanTileCanvas canvas = null;
private PanTileProjector projector = null;
private PanTileApplet applet = null;
private final int CHUNKSIZE = 1024;
public byte[] imageBuffer = null;
public InputStream in = null;
public int numRead = 0;
public int size = 0;
public boolean cache = true;
private int [] pixels = null;
private PixelGrabber pg = null;
private Image image = null;
public PanTileImageFetch(PanTileApplet a)
{
applet = a;
}
public void setImageURL(URL u)
{
imageURL = u;
}
public void setCanvas(PanTileCanvas c)
{
canvas = c;
}
public void setProjector(PanTileProjector p)
{
projector = p;
}
public boolean FIRSTIMAGELOADED = false;
public boolean READKILL = false;
public boolean getImageBytes()
{
int numRead = 0;
int offset = 0;
if(PanTileApplet.DEBUG) System.err.println("getImageBytes()...");
try
{
URLConnection urlConnection = imageURL.openConnection();
//urlConnection.setConnectTimeout(8000);
// if(canvas != null)
// {
// canvas.paintCachingIndicator("Loading.", FIRSTIMAGELOADED);
// }
// if(cache)
// urlConnection.setUseCaches(true);
// else
// urlConnection.setUseCaches(false);
//urlConnection.setReadTimeout(8000);
size = urlConnection.getContentLength();
if(size <= 0)
{
if(canvas != null)
{
canvas.KILLCACHINGINDICATOR = true;
canvas.paintMsgScreen("Image zero length...",false);
}
return false;
}
imageBuffer = new byte[size];
in = urlConnection.getInputStream();
if(PanTileApplet.DEBUG) System.err.println("Starting Read...");
while((numRead = in.read(imageBuffer,offset,imageBuffer.length - offset)) != -1)
{
//if(PanTileApplet.DEBUG) System.err.println("Bytes Read = " + numRead);
if(READKILL) return false;
offset += numRead;
if(offset >= imageBuffer.length)
{
byte[] temp = new byte[imageBuffer.length + CHUNKSIZE];
System.arraycopy(imageBuffer, 0, temp, 0, offset);
imageBuffer = temp;
}
Thread.yield();
}
// if(canvas != null)
// {
// if(PanTileApplet.DEBUG)System.err.println("canvas != null");
// canvas.KILLCACHINGINDICATOR = true;
// canvas.paintMsgScreen("Loaded " + canvas.sizeFormater(size) + " Mb...",FIRSTIMAGELOADED);
// }
if(PanTileApplet.DEBUG) System.err.println("**** Total Read = " + offset);
in.close();
}
catch(OutOfMemoryError oome)
{
if(PanTileApplet.DEBUG) System.err.println("getImageBytes() -- out of memory error...");
return false;
}
catch(SocketTimeoutException ste)
{
if(PanTileApplet.DEBUG) System.err.println("URL Read Timeout Exception...");
return false;
}
catch(IOException ioe)
{
if(PanTileApplet.DEBUG) System.err.println("Unable to load: " + imageURL + "\n");
return false;
}
return true;
}
private boolean makeImageFromToolkit()
{
int id = (int)System.currentTimeMillis();
if(PanTileApplet.DEBUG) System.err.println("makeImageFromToolkit()...");
try
{
//flushImage();
MediaTracker imageTracker = new MediaTracker(applet);
Toolkit tk = Toolkit.getDefaultToolkit();
image = tk.createImage(imageBuffer,0,size);
imageTracker.addImage(image,id);
//if(PanTileApplet.DEBUG) System.err.println("ID = " + id);
while(imageTracker.checkID(id,true) == false)
{
//if(PanTileApplet.DEBUG) System.err.println(".");
Thread.yield();
Thread.sleep(5);
}
if(imageTracker.isErrorID(id) == true)
{
//failed to load image--print out debugging stuff.
int imageStatus = imageTracker.statusID(id,false);
if((imageStatus & MediaTracker.ABORTED) != 0)
if(PanTileApplet.DEBUG) System.err.println("\n" + imageURL + " ABORTED\n");
if((imageStatus & MediaTracker.ERRORED) != 0)
if(PanTileApplet.DEBUG) System.err.println("\n" + imageURL + " ERRORED\n");
imageTracker.removeImage(image,id);
flushImage();
return false;
}
else //sucess in loading image
{
imageTracker.removeImage(image,id);
return true;
// if(!splashImage)
// getImageParametersAndPixels();
}
}
catch(OutOfMemoryError oome)
{
if(PanTileApplet.DEBUG) System.err.println("makeImageFromToolkit(): Out of memory error...");
return false;
}
catch(InterruptedException ie)
//catch(OutOfMemoryError oome)
{
if(PanTileApplet.DEBUG) System.err.println("makeImageFromToolkit() -- out of memory error...");
return false;
}
// catch(Exception e)
// {
// canvas.paintErrorScreen("Image corrupted - load aborted...");
// return false;
// }
}
public void freeMemory() {
Runtime rt = Runtime.getRuntime();
// System.err.println("Memory = " + (rt.freeMemory() + rt.maxMemory() - rt.totalMemory()));
System.err.println("Total Memory = " + rt.totalMemory());
System.err.println("Max Memory = " + rt.maxMemory());
System.err.println("Free Memory = " + (rt.freeMemory() / (1024 * 1024)));
rt.gc();
rt.runFinalization();
// System.err.println("Memory After gc = " + (rt.freeMemory() + rt.maxMemory() - rt.totalMemory()));
}
private void flushImage()
{
// System.err.println("flushImage()...");
System.gc();
// freeMemory();
if(image != null)
{
image.flush();
image = null;
}
if(bi != null)
{
bi.flush();
bi = null;
}
pg = null;
imageBuffer = null;
System.runFinalization();
System.gc();
// freeMemory();
}
private BufferedImage bi = null;
private boolean makeBufferedImage()
{
boolean status = true;
try
{
ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(imageBuffer));
Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = (ImageReader)readers.next();
ImageReadParam param = reader.getDefaultReadParam();
bi = new BufferedImage(1024,1024,BufferedImage.TYPE_INT_RGB);
param.setDestination(bi);
if(PanTileApplet.DEBUG)
System.err.println("Got a reader -- " + reader.getFormatName());
/*
* String [] formatNames = ImageIO.getReaderFormatNames();
for( int i = 0; i < formatNames.length; i++ )
{
System.out.println(formatNames[i]);
}*/
reader.setInput(iis, true);
bi = reader.read(0,param);
// int data[] = ((DataBufferInt)(_bimg.getRaster().getDataBuffer())).getData();
width = bi.getWidth();
height = bi.getHeight();
pixels = ((DataBufferInt)(bi.getRaster().getDataBuffer())).getData();
// int l = ((DataBufferInt)(bi.getRaster().getDataBuffer())).getData().length;
// int q [] = (int [])((DataBufferInt)(bi.getRaster().getDataBuffer())).getData();
// pixels = new int[width*height];
//// System.arraycopy(q,0,pixels,0,l);
// for(int i = 0; i < l; i++)
// {
// pixels[i] = q[i];
// }
}
catch (IllegalArgumentException iae)
{
if(PanTileApplet.DEBUG) System.err.println("Illegal Arguement Exception...");
status = false;
}
catch (IOException ioe)
{
if(PanTileApplet.DEBUG) System.err.println("IO Exception...");
status = false;
}
catch (Throwable oome)
{
// if(PanTileApplet.DEBUG)
System.err.println("Throwable: makeBufferedImage()...");
oome.printStackTrace();
}
return status;
}
private int width = 0;
private int height = 0;
public boolean KILLPGTHREAD = false;
private boolean getImageParametersAndPixels()
{
if(PanTileApplet.DEBUG) System.err.println("getImageParametersAndPixels()...");
KILLPGTHREAD = false;
// pixels = null;
// System.gc();
// Thread currentThread = null;
width = image.getWidth(canvas);
height = image.getHeight(canvas);
pixels = new int [width * height ];
int cnt = 0;
pg = new PixelGrabber(image,0,0,width,height,pixels,0,width);
//pg = new PixelGrabber(image,0,0,width,height,true);
// Runnable pgLoopCheck = new Runnable()
// {
// public void run()
// {
try
{
while (pg.grabPixels(0) != true)
{
//if(PanTileApplet.DEBUG) System.err.println("Grabbing()...");
Thread.yield();
// Thread.sleep(4);
// System.err.println(cnt++);
//pixelObject = pg.getPixels();
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0)
{
if(PanTileApplet.DEBUG) System.err.println("Image fetch aborted or errored...");
}
}
catch (OutOfMemoryError oome)
{
if(PanTileApplet.DEBUG) System.err.println("(2)OutOfMemoryError: getImageParametersAndPixels()...");
}
catch(InterruptedException ie)
{
if(PanTileApplet.DEBUG) System.err.println("(2)InterruptedException: getImageParametersAndPixels()...");
}
catch (Throwable oome)
{
if(PanTileApplet.DEBUG) System.err.println("(2)Throwable: getImageParametersAndPixels()...");
//oome.printStackTrace();
}
Thread.yield();
// }
// };
// Thread pgThread = new Thread(pgLoopCheck);
// pgThread.start();
// int status = 0;
// Thread.State ts = null;
// try
// {
// while((pgThread.isAlive()) && (!KILLPGTHREAD))
// {
// if(PanTileApplet.DEBUG) System.err.println("pgThread alive...");
// status = pg.getStatus();
// if(PanTileApplet.DEBUG) System.err.println("pixel grabber status = " + status);
// ts = pgThread.getState();
// if(PanTileApplet.DEBUG) System.err.println("thread state = " + ts.toString());
// if ((status & ImageObserver.ABORT) != 0)
// {
// if(PanTileApplet.DEBUG) System.err.println("isAlive: image fetch aborted or errored");
// pg.notify();
// pgThread.notify();
// }
// if(pgThread.isInterrupted())
// {
// if(PanTileApplet.DEBUG) System.err.println("pgThread is interrupted...");
// return false;
// }
// Thread.yield();
// Thread.sleep(100);
// }
// if(PanTileApplet.DEBUG) System.err.println("Exiting isAlive() loop...");
//// while (pg.grabPixels(1000) != true);
//// {
//// if(PanTileApplet.DEBUG) System.err.println("Grabbing()...");
//// Thread.yield();
//// //pixelObject = pg.getPixels();
//// }
//// if ((pg.getStatus() & ImageObserver.ABORT) != 0)
//// {
//// if(PanTileApplet.DEBUG) System.err.println("image fetch aborted or errored");
//// return false;
//// }
//
// }
// catch (OutOfMemoryError oome)
// {
// if(PanTileApplet.DEBUG) System.err.println("(1)Throwable: getImageParametersAndPixels()...");
// return false;
// }
// catch(InterruptedException ie)
// {
// if(PanTileApplet.DEBUG) System.err.println("(1)InterruptedException: getImageParametersAndPixels()...");
// return false;
// }
// catch (Throwable oome)
// {
// if(PanTileApplet.DEBUG) System.err.println("(1)Throwable: getImageParametersAndPixels()...");
// //oome.printStackTrace();
// return false;
// }
//pixels = (int [])pixelObject;
return true;
}
public Image getSplashImage(URL u)
{
try
{
imageURL = u;
if(!getImageBytes())
{
if(PanTileApplet.DEBUG) System.err.println("(1)Splash Image not found -- " + imageURL.getPath());
flushImage();
return image;
}
makeImageFromToolkit();
}
catch (Exception e)
{
if(PanTileApplet.DEBUG) System.err.println("(2)Splash Image not found --" + imageURL.getPath());
return null;
}
return image;
}
private URL documentBase = null;
public void setDocumentBase(URL db)
{
documentBase = db;
}
public void run()
{
Thread.yield();
projector.setImageParameters(4096,2048);
if(PanTileApplet.DEBUG) System.err.println("PanCyl Image Fetch run()...");
try
{
int suffix = 1;
for(int tiley = 0; tiley < 2048; tiley += 1024)
{
for(int tilex = 0; tilex < 4096; tilex += 1024)
{
// System.err.println("suffix = " + suffix);
imageURL = new URL(documentBase,("images/tile" + suffix + ".jpg"));
if(!getImageBytes())
{
canvas.paintMsgScreen("Problem loading " + imageURL.getPath(),false);
flushImage();
// canvas.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
canvas.setCursor(applet.getStopCursor());
return;
}
long pt0 = System.currentTimeMillis();
if(!makeBufferedImage())
{
canvas.paintMsgScreen("Image Creation Failed...",false);
flushImage();
applet.NOEVENTS = false;
return;
}
// if(!makeImageFromToolkit())
// {
// canvas.paintMsgScreen("Image Creation Failed...",false);
// flushImage();
// applet.NOEVENTS = false;
// return;
// }
// if(!getImageParametersAndPixels())
// {
// canvas.paintMsgScreen("Possible Out Of Memory Error...",false);
// pixels = null;
// flushImage();
// if(PanTileApplet.DEBUG) System.err.println("Grabbing Pixels Failed...");
// return;
// }
else
{
System.err.println((System.currentTimeMillis() - pt0));
if(PanTileApplet.DEBUG) System.err.println("Setting pixels...");
// projector.setImageParametersAndPixels(width, height, pixels);
projector.setTile(tilex, tiley, width, height, pixels);
flushImage();
}
suffix++;
}
}
}
catch(Throwable oome)
{
pixels = null;
pg = null;
System.gc();
flushImage();
if(PanTileApplet.DEBUG) System.err.println("run() -- out of memory error...");
applet.handleOutOfMemoryError();
}
// catch(Exception ex)
// {
// canvas.paintErrorScreen(imageURL.getPath());
// applet.NOEVENTS = false;
// //if(PanTileApplet.DEBUG) System.err.println("Exception in PanCylAppletImageFetch.run()..." + ex.toString());
// }
applet.NOEVENTS = false;
//return new Point(image.getWidth(previewArea),image.getHeight(previewArea));
}
}