/*
* Copyright 2013, Morten Nobel-Joergensen
*
* License: The BSD 3-Clause License
* http://opensource.org/licenses/BSD-3-Clause
*/
package com.mortennobel.imagescaling;
import com.mortennobel.imagescaling.experimental.ResampleOpSingleThread;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.border.LineBorder;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.IOException;
public class CorrectnessTest extends JFrame implements ActionListener {
private JPanel contentPanel = new JPanel(new GridLayout(0,6));
public CorrectnessTest(){
setUp();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(contentPanel,BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout());
JButton save = new JButton("Save");
save.addActionListener(this);
buttonPanel.add(save);
getContentPane().add(buttonPanel,BorderLayout.SOUTH);
addContent();
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private BufferedImage image;
public int getNumberOfThreads(){
return 1;
}
protected void setUp() {
try {
image = ImageIO.read(getClass().getResource("/com/mortennobel/imagescaling/largeimage.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
private void doRescale(ResampleFilter filter) {
ResampleOpSingleThread resampleOp = new ResampleOpSingleThread (200,200);
resampleOp.setFilter(filter);
//resampleOp.setNumberOfThreads(1);
resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.Normal);
BufferedImage image = resampleOp.filter(this.image, null);
addImage(filter.getName()+" Unsharpen", image);
resampleOp.addProgressListener(new ProgressListener() {
public void notifyProgress(float fraction) {
System.out.printf("Still working - %f percent %n",fraction*100);
}
});
resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.None);
image = resampleOp.filter(this.image, null);
addImage(filter.getName(), image);
}
private void doMultiStepRescaleOp(String name, Object renderingHint){
MultiStepRescaleOp mro = new MultiStepRescaleOp(200,200, renderingHint);
mro.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.Normal);
BufferedImage res = mro.filter(image, null);
addImage(name+" Unsharpen", res);
mro.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.None);
res = mro.filter(image, null);
addImage(name, res);
}
private void addImage(String name, BufferedImage image) {
System.out.println("Adding "+name);
JLabel label = new JLabel( new ImageIcon(image), JLabel.CENTER);
label.setBorder(new TitledBorder(new LineBorder(Color.DARK_GRAY),name));
contentPanel.add(label);
}
public void addContent() {
doRescale(new BellFilter());
doRescale(new BiCubicFilter());
doRescale(new BiCubicHighFreqResponse());
doRescale(new BoxFilter());
doRescale(new BSplineFilter());
doRescale(new HermiteFilter());
doRescale(new Lanczos3Filter());
doRescale(new MitchellFilter());
doRescale(new TriangleFilter());
doMultiStepRescaleOp("BILINEAR", RenderingHints.VALUE_INTERPOLATION_BILINEAR);
doMultiStepRescaleOp("BICUBIC", RenderingHints.VALUE_INTERPOLATION_BICUBIC);
}
public static void main(String[] args) {
new CorrectnessTest();
}
/**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
int res = fileChooser.showSaveDialog(this);
if (res==JFileChooser.APPROVE_OPTION){
BufferedImage bi = new BufferedImage(contentPanel.getWidth(),contentPanel.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
contentPanel.paint(g2d);
g2d.dispose();
try {
ImageIO.write(bi, "png", fileChooser.getSelectedFile());
} catch (IOException e1) {
JOptionPane.showMessageDialog(this, e1.getMessage());
}
}
}
}