2017-10-10 178 views
2

在Java swing中,是否有任何方法只绘制图像的形状,而不是图像本身?如果是这样,我该怎么做?绘制图像的形状

我添加了一张图片来向你展示我的意思: Click here

我的图像将包含一种颜色的形状和透明背景。我的意图是能够改变图像的颜色。

回答

5

ImageFilter是你想要的。可以使用GrayFilter。一个组件内

class ShapeFilter extends RGBImageFilter { 
    public RedBlueSwapFilter() { 
     // The filter's operation does not depend on the 
     // pixel's location, so IndexColorModels can be 
     // filtered directly. 
     canFilterIndexColorModel = true; 
    } 

    public int filterRGB(int x, int y, int rgb) { 
     return (rgb & 0x00_ff_ff_ff) == 0x00_ff_ff_ff // White 
       || rgb & 0xff_00_00_00) == 0x00_00_00) // or transparent 
       ? rgb : 0xff_ff_00_00; // Red opaque 
    } 
} 

用法(JComponent中)用的createImage:

Image img = ImageIO.readImage(...); 
ImageFilter filter = new ShapeFilter(); 
ImageProducer producer = new FilteredImageSource(img.getSource(), filter); 
Image img2 = createImage(producer); 
+0

谢谢!也可以在JComponent之外使用这个吗? – Duke

+1

['Toolkit.getDefaultToolkit().createImage'](https://docs.oracle.com/javase/8/docs/api/java/awt/Toolkit.html) –

3

您可以生成一个图像的 “面具”

Masked

该技术的大特点是你可以生成任何你想要的颜色或不透明度的面具

import java.awt.AlphaComposite; 
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.GraphicsConfiguration; 
import java.awt.GraphicsEnvironment; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.Transparency; 
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; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception 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 static GraphicsConfiguration getGraphicsConfiguration() { 
     return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); 
    } 

    public static BufferedImage createCompatibleImage(int width, int height, int transparency) { 
     BufferedImage image = getGraphicsConfiguration().createCompatibleImage(width, height, transparency); 
     image.coerceData(true); 
     return image; 
    } 

    public static void applyQualityRenderingHints(Graphics2D g2d) { 
     g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
     g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 
    } 

    public static BufferedImage generateMask(BufferedImage imgSource, Color color, float alpha) { 
     int imgWidth = imgSource.getWidth(); 
     int imgHeight = imgSource.getHeight(); 

     BufferedImage imgMask = createCompatibleImage(imgWidth, imgHeight, Transparency.TRANSLUCENT); 
     Graphics2D g2 = imgMask.createGraphics(); 
     applyQualityRenderingHints(g2); 

     g2.drawImage(imgSource, 0, 0, null); 
     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, alpha)); 
     g2.setColor(color); 

     g2.fillRect(0, 0, imgSource.getWidth(), imgSource.getHeight()); 
     g2.dispose(); 

     return imgMask; 
    } 

    public BufferedImage tint(BufferedImage master, BufferedImage tint) { 
     int imgWidth = master.getWidth(); 
     int imgHeight = master.getHeight(); 

     BufferedImage tinted = createCompatibleImage(imgWidth, imgHeight, Transparency.TRANSLUCENT); 
     Graphics2D g2 = tinted.createGraphics(); 
     applyQualityRenderingHints(g2); 
     g2.drawImage(master, 0, 0, null); 
     g2.drawImage(tint, 0, 0, null); 
     g2.dispose(); 

     return tinted; 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage master; 
     private BufferedImage mask; 

     public TestPane() { 
      try { 
       master = ImageIO.read(new File(bring your own image)); 
       mask = generateMask(master, Color.RED, 1.0f); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      Dimension size = super.getPreferredSize(); 
      if (master != null && mask != null) { 
       size = new Dimension(master.getWidth() + mask.getWidth(), Math.max(master.getHeight(), mask.getHeight())); 
      } 
      return size; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      int x = (getWidth() - (master.getWidth() + mask.getWidth()))/2; 
      int y = (getHeight() - master.getHeight())/2; 
      g.drawImage(master, x, y, this); 

      x += mask.getWidth(); 
      y = (getHeight() - mask.getHeight())/2; 
      g.drawImage(mask, x, y, this); 
     } 

    } 

}