Reputation: 381
The resize and flip functions are supposed to produce the resulting image in the left panel. However, the resize function just produces the same image and the flip function gives a blacked out image. How do I fix this?
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImgViewTester extends JFrame implements ActionListener
{
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem openItem = new JMenuItem("Open Image...");
JLabel imgLabel = new JLabel();
JLabel newImgLabel = new JLabel();
JPanel lblPanel = new JPanel();
JButton resizeBtn = new JButton("Resize");
JButton flipBtn = new JButton("Flip");
JPanel imagePanel;
JPanel btnPanel;
JPanel resizePanel;
JTextField widthTxt = new JTextField(10);
JTextField heightTxt = new JTextField(10);
JFileChooser fc = new JFileChooser();
File imgFile;
String imgFileName;
String imgTitle;
Image img;
//BufferedImage buffImg;
Graphics2D g2d;
Graphics gb;
public ImgViewTester()
{
initialize();
}
public void initialize()
{
this.setTitle("Image Editor");
this.setSize(700, 700);
this.setLayout(new BorderLayout());
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
setJMenuBar(menuBar);
menuBar.add(fileMenu);
fileMenu.add(openItem);
openItem.addActionListener(this);
imgLabel.setPreferredSize(new Dimension(500, 500));
newImgLabel.setPreferredSize(new Dimension(500, 500));
imagePanel = new JPanel();
imagePanel.add(imgLabel);
imagePanel.add(newImgLabel);
btnPanel = new JPanel();
btnPanel.add(resizeBtn);
btnPanel.add(flipBtn);
resizeBtn.addActionListener(this);
flipBtn.addActionListener(this);
resizePanel = new JPanel();
resizePanel.add(widthTxt);
resizePanel.add(heightTxt);
this.add(imagePanel, BorderLayout.CENTER);
this.add(btnPanel, BorderLayout.SOUTH);
this.add(resizePanel, BorderLayout.NORTH);
this.pack();
}
public static void main(String[] args){
new ImgViewTester();
}
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(openItem))
{
JFileChooser imgFileChooser = new JFileChooser();
FileNameExtensionFilter imgFilter =
new FileNameExtensionFilter("GIF, PNG, JPEG or JPG files",
"gif", "png", "jpg", "jpeg");
imgFileChooser.setFileFilter(imgFilter);
int returnVal = imgFileChooser.showOpenDialog(null);
imgFile = imgFileChooser.getSelectedFile();
//variables for getting name of image
imgFileName = imgFile.getName();
imgTitle = imgFileName.substring(imgFileName.lastIndexOf("/") + 1);
if(returnVal == JFileChooser.APPROVE_OPTION)
{
try
{
img = ImageIO.read(imgFile);
img = img.getScaledInstance(500, -1, Image.SCALE_DEFAULT);
imgLabel.setIcon(new ImageIcon(img));
}
catch(IOException ioe)
{
System.out.println("Oops! Image I/O exception occurred!");
ioe.printStackTrace();
}
}
else if(returnVal == JFileChooser.CANCEL_OPTION)
{
System.out.println("Operation Cancelled!");
}
}
else if(e.getSource().equals(resizeBtn))
{
int newWidth= Integer.parseInt(widthTxt.getText());
int newHeight = Integer.parseInt(heightTxt.getText());
img.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);
newImgLabel.setIcon(new ImageIcon(img));
System.out.println(imgFileName);
}
else if(e.getSource().equals(flipBtn))
{
ImageIcon currIcon = (ImageIcon)imgLabel.getIcon();
BufferedImage buffImg = new BufferedImage(currIcon.getIconWidth(), currIcon.getIconHeight(), BufferedImage.TYPE_INT_RGB);
AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
tx.translate(-buffImg.getWidth(null), 0);
AffineTransformOp op = new AffineTransformOp(tx,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
buffImg = op.filter(buffImg, null);
newImgLabel.setIcon(new ImageIcon(buffImg));
System.out.println(newImgLabel);
}
}
}//end of class
Upvotes: 2
Views: 183
Reputation: 324078
img.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);
imgLabel.setIcon(new ImageIcon(img));
Should be:
Image scaled = img.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);
imgLabel.setIcon(new ImageIcon(scaled));
Whenever I've done a flip before I have done the translate before the scale:
import java.awt.*;
import javax.swing.*;
class MirrorImageIcon extends ImageIcon
{
public MirrorImageIcon(String filename)
{
super(filename);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y)
{
Graphics2D g2 = (Graphics2D)g.create();
g2.translate(0, getIconHeight());
g2.scale(1, -1);
super.paintIcon(c, g2, x, y);
g2.dispose();
}
private static void createAndShowUI()
{
ImageIcon io = new MirrorImageIcon("dukewavered.gif");
JLabel label = new JLabel(io);
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(label, BorderLayout.SOUTH);
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Upvotes: 6