package uk.co.mmscomputing.application.imageviewer;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.print.*;
import javax.swing.*;
public class ImagePanel extends JComponent implements Printable{
protected BufferedImage image=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
public ImagePanel(){
}
public BufferedImage getImage(){return image;}
public void setImage(BufferedImage image){
this.image=image;repaint();
}
public void paint(Graphics gc){
Graphics2D g=(Graphics2D)gc;
g.drawImage(image,0,0,null);
}
public Dimension getPreferredSize(){
return new Dimension(image.getWidth(),image.getHeight());
}
public int print(Graphics gc, PageFormat pf, int page) throws PrinterException{
Graphics2D g=(Graphics2D)gc;
double xs = pf.getImageableWidth()/image.getWidth();
double ys = pf.getImageableHeight()/image.getHeight();
double newscale = Math.min(xs, ys);
g.translate(pf.getImageableX(),pf.getImageableY());
g.drawImage(image,0,0,(int)(image.getWidth()*newscale),(int)(image.getHeight()*newscale),this);
return Printable.PAGE_EXISTS;
}
public void rotate(){
BufferedImage oldimage=image;
try{
int w=image.getWidth(),h=image.getHeight(),t=image.getType();
image=newImage(w,h,t);
Graphics2D g=image.createGraphics();
AffineTransform rotate = new AffineTransform(0.0,1.0,-1.0,0.0,(double)oldimage.getHeight(),0.0);
g.drawRenderedImage(oldimage,rotate);
setSize(image.getWidth(),image.getHeight());
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+"\n\t.rotate:\n\t"+e.getMessage());
image=oldimage;
e.printStackTrace();
}catch(OutOfMemoryError e){
System.out.println("9\b"+getClass().getName()+"\n\t.rotate:\n\t"+e.getMessage());
image=oldimage;
}
}
static public BufferedImage newImage(int w,int h,int t)throws Exception{
try{
return new BufferedImage(h,w,t);
}catch(OutOfMemoryError mem){
System.err.println("start gc ; free memory "+Runtime.getRuntime().freeMemory());
Runtime.getRuntime().gc();
System.err.println("end gc ; free memory "+Runtime.getRuntime().freeMemory());
try{
return new BufferedImage(h,w,t);
}catch(java.lang.OutOfMemoryError me){
throw new Exception("uk.co.mmscomputing.application.imageviewer.newImage:\n\t"+me.getMessage());
}
}
}
}