/**
JPEGEditor
Image of earth from http://earth.jsc.nasa.gov/
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.io.*;import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.filechooser.*;import com.sun.image.codec.jpeg.*;import java.awt.print.*;public class JPEGEditor extends JFrame
{
public final static Dimension VERTICAL_RIGID_SIZE
= new Dimension(1,3);
public final static Dimension HORIZONTAL_RIGID_SIZE
= new Dimension(3,1); protected File m_currentDir = new File(".");
protected File m_currentFile = null; protected JFileChooser m_chooser;
protected JPEGPanel m_panel;
protected JSlider m_slHorzDensity;
protected JSlider m_slVertDensity;
protected JSlider m_slQuality; protected BufferedImage m_bi1, m_bi2; public JPEGEditor() {
super("JPEG Editor");
setSize(600, 400); m_chooser = new JFileChooser();
SimpleFilter filter = new SimpleFilter("jpg",
"JPEG Image Files");
m_chooser.setFileFilter(filter);
m_chooser.setCurrentDirectory(m_currentDir); m_panel = new JPEGPanel();
JScrollPane ps = new JScrollPane(m_panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
getContentPane().add(ps, BorderLayout.CENTER); JPanel p, p1; m_slVertDensity = new JSlider(JSlider.VERTICAL,
100, 500, 300);
m_slVertDensity.setExtent(50);
m_slVertDensity.setPaintLabels(true);
m_slVertDensity.setMajorTickSpacing(100);
m_slVertDensity.setMinorTickSpacing(50);
m_slVertDensity.setPaintTicks(true);
m_slVertDensity.putClientProperty("JSlider.isFilled", Boolean.TRUE);
p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Vert. dens."));
p.add(Box.createRigidArea(HORIZONTAL_RIGID_SIZE));
p.add(m_slVertDensity);
p.add(Box.createRigidArea(HORIZONTAL_RIGID_SIZE));
getContentPane().add(p, BorderLayout.EAST); m_slHorzDensity = new JSlider(JSlider.HORIZONTAL,
100, 500, 300);
m_slHorzDensity.setExtent(50);
m_slHorzDensity.setPaintLabels(true);
m_slHorzDensity.setMajorTickSpacing(100);
m_slHorzDensity.setMinorTickSpacing(50);
m_slHorzDensity.setPaintTicks(true);
m_slHorzDensity.putClientProperty("JSlider.isFilled", Boolean.TRUE); p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Horizontal density"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p.add(m_slHorzDensity);
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p1 = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p1.add(p); m_slQuality = new JSlider(JSlider.HORIZONTAL,
0, 100, 100);
Hashtable labels = new Hashtable(6);
for (float q = 0; q <= 1.0; q += 0.2)
labels.put(new Integer((int)(q*100)),
new JLabel("" + q, JLabel.CENTER ));
m_slQuality.setLabelTable(labels);
m_slQuality.setExtent(10);
m_slQuality.setPaintLabels(true);
m_slQuality.setMinorTickSpacing(10);
m_slQuality.setPaintTicks(true);
m_slQuality.putClientProperty("JSlider.isFilled", Boolean.TRUE); p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Quality"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p.add(m_slQuality);
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p1.add(p); JButton btApply = new JButton("Apply");
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
apply();
}
};
btApply.addActionListener(lst);
p1.add(btApply); JButton btReset = new JButton("Reset");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
reset();
}
};
btReset.addActionListener(lst);
p1.add(btReset);
getContentPane().add(p1, BorderLayout.SOUTH); setJMenuBar(createMenuBar()); WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
} protected JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu mFile = new JMenu("File");
mFile.setMnemonic('f'); JMenuItem mItem = new JMenuItem("Open...");
mItem.setMnemonic('o');
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_chooser.showOpenDialog(JPEGEditor.this) !=
JFileChooser.APPROVE_OPTION)
return;
m_currentDir = m_chooser.getCurrentDirectory();
File fChoosen = m_chooser.getSelectedFile();
openFile(fChoosen);
}
};
mItem.addActionListener(lst);
mFile.add(mItem); mItem = new JMenuItem("Save");
mItem.setMnemonic('s');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveFile(m_currentFile);
}
};
mItem.addActionListener(lst);
mFile.add(mItem); mItem = new JMenuItem("Save As...");
mItem.setMnemonic('a');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_chooser.setSelectedFile(m_currentFile);
if (m_chooser.showSaveDialog(JPEGEditor.this) !=
JFileChooser.APPROVE_OPTION)
return;
m_currentDir = m_chooser.getCurrentDirectory();
File fChoosen = m_chooser.getSelectedFile();
if (fChoosen!=null && fChoosen.exists()) {
String message = "File " + fChoosen.getName()+
" already exists. Override?";
int result = JOptionPane.showConfirmDialog(
JPEGEditor.this, message, getTitle(),
JOptionPane.YES_NO_OPTION);
if (result != JOptionPane.YES_OPTION)
return;
}
setCurrentFile(fChoosen);
saveFile(fChoosen);
}
};
mItem.addActionListener(lst);
mFile.add(mItem); mItem = new JMenuItem("Print...");
mItem.setMnemonic('p');
ActionListener lstPrint = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
public void run() {
if (m_panel.getBufferedImage() != null)
printData();
}
};
runner.start();
}
};
mItem.addActionListener(lstPrint);
mFile.add(mItem);
mFile.addSeparator(); mItem = new JMenuItem("Exit");
mItem.setMnemonic('x');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
JPEGEditor
Image of earth from http://earth.jsc.nasa.gov/
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import java.io.*;import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.filechooser.*;import com.sun.image.codec.jpeg.*;import java.awt.print.*;public class JPEGEditor extends JFrame
{
public final static Dimension VERTICAL_RIGID_SIZE
= new Dimension(1,3);
public final static Dimension HORIZONTAL_RIGID_SIZE
= new Dimension(3,1); protected File m_currentDir = new File(".");
protected File m_currentFile = null; protected JFileChooser m_chooser;
protected JPEGPanel m_panel;
protected JSlider m_slHorzDensity;
protected JSlider m_slVertDensity;
protected JSlider m_slQuality; protected BufferedImage m_bi1, m_bi2; public JPEGEditor() {
super("JPEG Editor");
setSize(600, 400); m_chooser = new JFileChooser();
SimpleFilter filter = new SimpleFilter("jpg",
"JPEG Image Files");
m_chooser.setFileFilter(filter);
m_chooser.setCurrentDirectory(m_currentDir); m_panel = new JPEGPanel();
JScrollPane ps = new JScrollPane(m_panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
getContentPane().add(ps, BorderLayout.CENTER); JPanel p, p1; m_slVertDensity = new JSlider(JSlider.VERTICAL,
100, 500, 300);
m_slVertDensity.setExtent(50);
m_slVertDensity.setPaintLabels(true);
m_slVertDensity.setMajorTickSpacing(100);
m_slVertDensity.setMinorTickSpacing(50);
m_slVertDensity.setPaintTicks(true);
m_slVertDensity.putClientProperty("JSlider.isFilled", Boolean.TRUE);
p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Vert. dens."));
p.add(Box.createRigidArea(HORIZONTAL_RIGID_SIZE));
p.add(m_slVertDensity);
p.add(Box.createRigidArea(HORIZONTAL_RIGID_SIZE));
getContentPane().add(p, BorderLayout.EAST); m_slHorzDensity = new JSlider(JSlider.HORIZONTAL,
100, 500, 300);
m_slHorzDensity.setExtent(50);
m_slHorzDensity.setPaintLabels(true);
m_slHorzDensity.setMajorTickSpacing(100);
m_slHorzDensity.setMinorTickSpacing(50);
m_slHorzDensity.setPaintTicks(true);
m_slHorzDensity.putClientProperty("JSlider.isFilled", Boolean.TRUE); p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Horizontal density"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p.add(m_slHorzDensity);
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p1 = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p1.add(p); m_slQuality = new JSlider(JSlider.HORIZONTAL,
0, 100, 100);
Hashtable labels = new Hashtable(6);
for (float q = 0; q <= 1.0; q += 0.2)
labels.put(new Integer((int)(q*100)),
new JLabel("" + q, JLabel.CENTER ));
m_slQuality.setLabelTable(labels);
m_slQuality.setExtent(10);
m_slQuality.setPaintLabels(true);
m_slQuality.setMinorTickSpacing(10);
m_slQuality.setPaintTicks(true);
m_slQuality.putClientProperty("JSlider.isFilled", Boolean.TRUE); p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(),
"Quality"));
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p.add(m_slQuality);
p.add(Box.createRigidArea(VERTICAL_RIGID_SIZE));
p1.add(p); JButton btApply = new JButton("Apply");
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
apply();
}
};
btApply.addActionListener(lst);
p1.add(btApply); JButton btReset = new JButton("Reset");
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
reset();
}
};
btReset.addActionListener(lst);
p1.add(btReset);
getContentPane().add(p1, BorderLayout.SOUTH); setJMenuBar(createMenuBar()); WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
} protected JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu mFile = new JMenu("File");
mFile.setMnemonic('f'); JMenuItem mItem = new JMenuItem("Open...");
mItem.setMnemonic('o');
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_chooser.showOpenDialog(JPEGEditor.this) !=
JFileChooser.APPROVE_OPTION)
return;
m_currentDir = m_chooser.getCurrentDirectory();
File fChoosen = m_chooser.getSelectedFile();
openFile(fChoosen);
}
};
mItem.addActionListener(lst);
mFile.add(mItem); mItem = new JMenuItem("Save");
mItem.setMnemonic('s');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveFile(m_currentFile);
}
};
mItem.addActionListener(lst);
mFile.add(mItem); mItem = new JMenuItem("Save As...");
mItem.setMnemonic('a');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_chooser.setSelectedFile(m_currentFile);
if (m_chooser.showSaveDialog(JPEGEditor.this) !=
JFileChooser.APPROVE_OPTION)
return;
m_currentDir = m_chooser.getCurrentDirectory();
File fChoosen = m_chooser.getSelectedFile();
if (fChoosen!=null && fChoosen.exists()) {
String message = "File " + fChoosen.getName()+
" already exists. Override?";
int result = JOptionPane.showConfirmDialog(
JPEGEditor.this, message, getTitle(),
JOptionPane.YES_NO_OPTION);
if (result != JOptionPane.YES_OPTION)
return;
}
setCurrentFile(fChoosen);
saveFile(fChoosen);
}
};
mItem.addActionListener(lst);
mFile.add(mItem); mItem = new JMenuItem("Print...");
mItem.setMnemonic('p');
ActionListener lstPrint = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
public void run() {
if (m_panel.getBufferedImage() != null)
printData();
}
};
runner.start();
}
};
mItem.addActionListener(lstPrint);
mFile.add(mItem);
mFile.addSeparator(); mItem = new JMenuItem("Exit");
mItem.setMnemonic('x');
lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
protected void openFile(final File file) {
if (file == null || !file.exists())
return;
setCurrentFile(file); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
FileInputStream in = new FileInputStream(file);
JPEGImageDecoder decoder =
JPEGCodec.createJPEGDecoder(in);
m_bi1 = decoder.decodeAsBufferedImage();
m_bi2 = null;
in.close();
SwingUtilities.invokeLater( new Runnable() {
public void run() { reset(); }
});
}
catch (Exception ex) {
ex.printStackTrace();
System.err.println("openFile: "+ex.toString());
}
setCursor(Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
}
};
runner.start();
} protected void saveFile(final File file) {
if (file == null || m_panel.getBufferedImage() == null)
return; setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
FileOutputStream out = new FileOutputStream(file);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(m_panel.getBufferedImage());
out.close();
}
catch (Exception ex) {
ex.printStackTrace();
System.err.println("apply: "+ex.toString());
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}
protected void apply() {
if (m_bi1 == null)
return; setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
JPEGImageEncoder encoder =
JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param =
encoder.getDefaultJPEGEncodeParam(m_bi1);
float quality = m_slQuality.getValue()/100.0f;
param.setQuality(quality, false);
param.setDensityUnit(
JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
int xDensity = m_slHorzDensity.getValue();
param.setXDensity(xDensity);
int yDensity = m_slVertDensity.getValue();
param.setYDensity(yDensity); encoder.setJPEGEncodeParam(param);
encoder.encode(m_bi1); ByteArrayInputStream in = new ByteArrayInputStream(
out.toByteArray());
JPEGImageDecoder decoder =
JPEGCodec.createJPEGDecoder(in);
final BufferedImage bi2 = decoder.decodeAsBufferedImage();
SwingUtilities.invokeLater( new Runnable() {
public void run() {
m_panel.setBufferedImage(bi2);
}
});
}
catch (Exception ex) {
ex.printStackTrace();
System.err.println("apply: "+ex.toString());
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
};
runner.start();
}
protected void reset() {
if (m_bi1 != null) {
m_panel.setBufferedImage(m_bi1);
m_slQuality.setValue(100);
m_slHorzDensity.setValue(300);
m_slVertDensity.setValue(300);
}
} public void printData() {
getJMenuBar().repaint();
try {
PrinterJob prnJob = PrinterJob.getPrinterJob();
prnJob.setPrintable(m_panel);
if (!prnJob.printDialog())
return;
setCursor( Cursor.getPredefinedCursor(
Cursor.WAIT_CURSOR));
prnJob.print();
setCursor( Cursor.getPredefinedCursor(
Cursor.DEFAULT_CURSOR));
JOptionPane.showMessageDialog(this,
"Printing completed successfully", "JPEGEditor2",
JOptionPane.INFORMATION_MESSAGE);
}
catch (PrinterException e) {
e.printStackTrace();
System.err.println("Printing error: "+e.toString());
}
} public static void main(String argv[]) {
new JPEGEditor();
}
}class JPEGPanel extends JPanel implements Printable
{
protected BufferedImage m_bi = null; public int m_maxNumPage = 1; public JPEGPanel() {} public void setBufferedImage(BufferedImage bi) {
if (bi == null)
return;
m_bi = bi;
Dimension d = new Dimension(m_bi.getWidth(this),
m_bi.getHeight(this));
setPreferredSize(d);
revalidate();
repaint();
} public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension d = getSize();
g.setColor(getBackground());
g.fillRect(0, 0, d.width, d.height);
if (m_bi != null)
g.drawImage(m_bi, 0, 0, this);
}
public BufferedImage getBufferedImage() {
return m_bi;
} public int print(Graphics pg, PageFormat pageFormat,
int pageIndex) throws PrinterException {
if (pageIndex >= m_maxNumPage || m_bi == null)
return NO_SUCH_PAGE; pg.translate((int)pageFormat.getImageableX(),
(int)pageFormat.getImageableY());
int wPage = (int)pageFormat.getImageableWidth();
int hPage = (int)pageFormat.getImageableHeight(); int w = m_bi.getWidth(this);
int h = m_bi.getHeight(this);
if (w == 0 || h == 0)
return NO_SUCH_PAGE;
int nCol = Math.max((int)Math.ceil((double)w/wPage), 1);
int nRow = Math.max((int)Math.ceil((double)h/hPage), 1);
m_maxNumPage = nCol*nRow; int iCol = pageIndex % nCol;
int iRow = pageIndex / nCol;
int x = iCol*wPage;
int y = iRow*hPage;
int wImage = Math.min(wPage, w-x);
int hImage = Math.min(hPage, h-y); pg.drawImage(m_bi, 0, 0, wImage, hImage,
x, y, x+wImage, y+hImage, this);
System.gc();
return PAGE_EXISTS;
}
}
class SimpleFilter
extends javax.swing.filechooser.FileFilter
{
private String m_description = null;
private String m_extension = null; public SimpleFilter(String extension, String description) {
m_description = description;
m_extension = "."+extension.toLowerCase();
} public String getDescription() {
return m_description;
} public boolean accept(File f) {
if (f == null)
return false;
if (f.isDirectory())
return true;
return f.getName().toLowerCase().endsWith(m_extension);
}
}