2

Javaで小さな画像処理をしようとしています。ユーザーは、ボタンをクリックすることで、画像をロードし、画像に簡単な変更を加えることができるはずです。画像の読み込みと表示は問題ありませんが、画像からバイナリ画像を作成しようとすると、repaint()メソッドによって画面に黒い画像が表示されます。問題はrepaint()メソッドにあると思います。私はすでに検索機能とGoogleを使用しましたが、コードの何が問題になっているのかまだわかりません。それは私がこれまでに持っているものです:

public class ImageProcessing extends JFrame implements ActionListener {

    private  JPanel imagePanel;
    private  JPanel buttonPanel;
    private JButton binaryButton;
    private  JButton loadButton;    
    private BufferedImage image;    
    private final String WINDOW_TITLE = "Image Processing";

    public ImageProcessing() {
        createWindow();
    }

    private void createWindow() {
        this.setTitle(WINDOW_TITLE);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            
        this.setSize(500, 500);

        imagePanel = new ImagePanel();
        buttonPanel = new JPanel();
        this.add(imagePanel, BorderLayout.CENTER);

        loadButton = new JButton("Load image");
        loadButton.addActionListener(this);
        buttonPanel.add(loadButton);
        this.add(buttonPanel, BorderLayout.SOUTH);

        binaryButton = new JButton("binary");
        binaryButton.addActionListener(this);
        buttonPanel.add(binaryButton);

        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
       if(e.getSource() == this.loadButton) {
           String filePath = getImageFile();
        if (filePath != null) {
          try {
            image = ImageIO.read(new File(filePath));
           // imageBackup = image;
        } catch (IOException e1) {
            e1.printStackTrace();
        }
          this.repaint();
        }
       } else if (e.getSource() == this.binaryButton) {
           image = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
           imagePanel = new ImagePanel();
           this.repaint();
       }
    }

    private String getImageFile() {
        JFileChooser chooser = new JFileChooser();
        int result = chooser.showOpenDialog(null);
        File file = null;
        if (result == JFileChooser.APPROVE_OPTION) {
          file = chooser.getSelectedFile();
          return file.getPath();
        } else
          return null;
    }       

    class ImagePanel extends JPanel {
       public void paint(Graphics g) {
          g.drawImage(image, 0, 0, this);
       }        
    }
}

あなたが私を助けて、私が間違っていることを説明してくれることを願っています。前もって感謝します。

4

2 に答える 2

3

どのような画像処理をしようとしているのかは明らかではありません。コード..

image = new BufferedImage(
    image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);

..単純に、バイト バイナリ タイプの新しい (空白の) イメージを作成します。あなたはそれに何も引き込んでいません。それが黒い理由です。

それに描画するには (たとえば、元の画像をコピーしようとする場合)、グラフィックス コンテキストを取得できます。

Graphics2D g = image.createGraphics();

そして、次のようにコピーします。

g.drawImage(otherImage, 0, 0, this);

Java がフル デプス RGB 画像からTYPE_BYTE_BINARY. 例外が発生する場合があります。

于 2012-12-27T18:46:06.190 に答える
1

画像の代わりに画像パネルを交換しています。また、バイナリ イメージに対して実際の描画を実行していません。元の画像をバイナリに変換する方法の例を次に示します。これは、提供されたコードに基づいています。

else if (e.getSource() == this.binaryButton) {
    BufferedImage mask = new BufferedImage(image.getWidth(),
            image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
    Graphics g = mask.getGraphics();
    g.drawImage(image, 0, 0, this);
    g.dispose();
    image = mask;
    this.repaint();
}
于 2012-12-27T18:46:24.833 に答える