【发布时间】:2015-04-18 03:42:24
【问题描述】:
调整大小和翻转功能应该在左侧面板中生成结果图像。然而,resize 函数只产生相同的图像,而翻转函数给出了一个黑色的图像。我该如何解决这个问题?
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
【问题讨论】:
标签: java swing bufferedimage javax.imageio affinetransform