Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么图像重设大小和翻转功能不起作用?_Java_Swing_Bufferedimage_Javax.imageio_Affinetransform - Fatal编程技术网

Java 为什么图像重设大小和翻转功能不起作用?

Java 为什么图像重设大小和翻转功能不起作用?,java,swing,bufferedimage,javax.imageio,affinetransform,Java,Swing,Bufferedimage,Javax.imageio,Affinetransform,“调整大小”和“翻转”功能用于在左侧面板中生成结果图像。但是,resize函数只会生成相同的图像,而flip函数会生成一个黑色的图像。我该如何解决这个问题 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; imp

“调整大小”和“翻转”功能用于在左侧面板中生成结果图像。但是,resize函数只会生成相同的图像,而flip函数会生成一个黑色的图像。我该如何解决这个问题

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
应该是:

Image scaled = img.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);
imgLabel.setIcon(new ImageIcon(scaled)); 
每当我在比例尺前完成平移之前完成翻转时:

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();
            }
        });
    }
}

有没有办法仍然使用仿射变换进行翻转?我一直在四处寻找,但我仍在试图避免使用Graphics paint()方法。我不理解这个注释,这个解决方案与paint(…)方法无关。图标如何绘制图像与代码无关。无论如何,我的主要意见是在比例尺之前做翻译。您的代码先进行缩放,然后进行平移。因此,如果您想使用仿射变换,那么我建议您获取已翻译的实例,然后进行缩放。
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();
            }
        });
    }
}