ImagePanel is intended as a service class for image processing,
but includes a main program that displays an image chosen from the command line
or a JFileChooser.
C:\ece538\impro1>java ImagePanel bld.jpg Image: bld.jpg size: 327 x 215 |
ImagePanel.javaimport java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.net.URL;
public class ImagePanel extends JPanel {
BufferedImage img;
String title;
double scl;
public ImagePanel() {
title="Blank";
scl = 1.0;
img = null;
}
public ImagePanel(BufferedImage img, String title) {
this.img = img;
this.title = title;
setScale();
}
public ImagePanel(String filename) {
File f = new File(filename);
if (f.exists()) readImage(filename);
else {
URL imageSrc = getClass().getResource(filename);
if (imageSrc!=null) readImage(imageSrc);
else {
System.err.println("file not found: " + filename);
System.exit(-1);
}
}
title = filename;
setScale();
}
public ImagePanel(File f) {
readImage(f);
title = f.getName();
setScale();
}
public void setMag(int mag) {
scl = mag;
repaint();
}
static JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
static File choose_image() {
fc.setAcceptAllFileFilterUsed(false);
fc.addChoosableFileFilter(new FileNameExtensionFilter("Images", "jpg", "png", "gif", "bmp"));
fc.setAcceptAllFileFilterUsed(true);
int result = fc.showOpenDialog(null);
if (result== JFileChooser.APPROVE_OPTION)
return fc.getSelectedFile();
else return null;
}
private static String getFileExtension(File file) {
String name = file.getName();
int loc = name.lastIndexOf(".");
if (loc>0) return name.substring(loc+1);
else return "";
}
public void saveFile(String name) {
fc.setSelectedFile(new File(name));
int result = fc.showSaveDialog(null);
if (result != JFileChooser.APPROVE_OPTION) return;
File f = fc.getSelectedFile();
if (f.exists()) {
result = JOptionPane.showConfirmDialog(this, "Overwrite existing file?","Warning",
JOptionPane.WARNING_MESSAGE);
if (result==JOptionPane.CANCEL_OPTION) return;
}
String ext = getFileExtension(f);
writeImage(fc.getSelectedFile(), ext);
}
public int getImageHeight() {
return img.getHeight();
}
public void setScale()
{
if (img==null) return;
int w = img.getWidth();
int h = img.getHeight();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension dim = toolkit.getScreenSize();
//System.out.format("screen size: %d x %d %n",dim.width,dim.height);
//System.out.format("image size %d x %d%n",w,h);
scl = 1.0;
if (w<128) {
scl = (double) 128/w;
}
else {
scl = Math.min((double) (dim.width-200)/w, (double) (dim.height-200)/h);
if (scl>1.0) scl = 1.0;
}
}
public void info() {
System.out.println("Image: " + title);
if (img==null) return;
System.out.format("size: %d x %d%n",img.getWidth(),img.getHeight());
if (scl!=1.0) System.out.format("scale %g%n",scl);
}
public void readImage(URL src) {
try {
img = ImageIO.read(src);
} catch (IOException e) {
System.out.println(e.getMessage());
System.exit(-1);
}
}
public void readImage(File f) {
try {
img = ImageIO.read(f);
} catch (IOException e) {
System.out.println(e.getMessage());
System.exit(-1);
}
}
public void readImage(String filename) {
try {
img = ImageIO.read(new File(filename));
} catch (IOException e) {
//System.out.println(e); // e.getMessage());
System.out.println(filename + " not found");
System.exit(-1);
}
}
public void writeImage(String filename) {
File f = new File(filename);
String ext = getFileExtension(f);
writeImage(f,ext);
}
public void writeImage(File file, String format) {
try {
ImageIO.write(img, format, file);
} catch (IOException e) {
System.out.println("image write failed");
System.out.println(e);
System.exit(-1);
}
}
public Dimension getPreferredSize() {
int w, h;
w = 240;
h = 180;
if (img != null) {
w = (int) (scl*img.getWidth());
h = (int) (scl*img.getHeight());
}
//System.out.format("preferred size: %d x %d%n",w,h);
return new Dimension(w,h);
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
super.paintComponent(g2);
if (img==null) return;
if (scl==1.0) g2.drawImage(img, 0, 0, null);
else g2.drawImage(img, AffineTransform.getScaleInstance(scl, scl), null);
}
public void makeFrame() {
EventQueue.invokeLater(() -> {
JFrame app = new JFrame(title);
app.add(this);
app.pack();
app.setLocation(100,100);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setVisible(true);
});
}
public static void main(String[] args) {
ImagePanel f1 = null;
String filename = "robin2.jpg";
if (args.length>0) {
filename = args[0];
f1 = new ImagePanel(filename);
}
else {
File f = ImagePanel.choose_image();
if (f!=null) f1 = new ImagePanel(f);
else f1 = new ImagePanel();
}
f1.info();
f1.makeFrame();
}
}
Maintained by John Loomis, updated Wed Mar 18 15:37:49 2020