2013-12-19 109 views
0

我想爲我有的BufferedImage的子區域着色。我目前在做:着色BufferedImage的區域

public BufferedImage paintSubImage(BufferedImage img, int x, int y, int w, int h) { 
    Graphics g = img.getGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillRect(x,y,w,h); 
    return img; 
} 

但我無法爲它着色。我做錯了嗎?

+1

看起來不錯給我。發佈你的'SSCCE'來展示這個問題,所以我們可以看到你在使用BufferedImage後如何使用它的上下文。 – camickr

+0

@camickr:這種方法會改變我傳遞的原始BufferedImage對象,還是我返回無色的BufferedImage? –

+0

它會改變原始的BufferedImage。 – camickr

回答

1

鑑於事情很少或沒有上下文,很難確切地知道什麼是錯的。

一般的經驗法則不過,如果你創建/打開它,你應該配置/關閉它...

Splat

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ColorMe { 

    public static void main(String[] args) { 
     new ColorMe(); 
    } 

    public ColorMe() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage img; 

     public TestPane() { 
      try { 
       img = ImageIO.read(new File("/path/to/image...")); 

       addMouseListener(new MouseAdapter() { 

        @Override 
        public void mouseClicked(MouseEvent e) { 
         Point p = e.getPoint(); 
         Rectangle bounds = getPictureBounds(); 
         if (bounds.contains(p)) { 

          int x = p.x - bounds.x; 
          int y = p.y - bounds.y; 

          splat(img, x, y); 
          repaint(); 

         } 
        } 

       }); 

      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     protected void splat(BufferedImage img, int x, int y) { 
      Graphics2D g2d = img.createGraphics(); 
      g2d.setColor(Color.RED); 
      g2d.fillOval(x - 10, y - 10, 20, 20); 
      g2d.dispose(); 
     } 

     protected Rectangle getPictureBounds() { 

      Rectangle bounds = new Rectangle(); 

      if (img != null) { 

       bounds.x = (getWidth() - img.getWidth())/2; 
       bounds.y = (getHeight() - img.getHeight())/2; 
       bounds.width = img.getWidth(); 
       bounds.height = img.getHeight(); 

      } 

      return bounds; 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(), img.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (img != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       Rectangle bounds = getPictureBounds(); 
       g2d.drawImage(img, bounds.x, bounds.y, this); 
       g2d.dispose(); 
      } 
     } 
    } 

}