2017-10-10 13 views
2

Javaのスイングでは、画像そのものではなく、画像の形だけを描画する方法はありますか?もしそうなら、どうしたらいいですか?画像の形状を描く

Click hereを示す画像を追加しました。

私の画像は、単色の形状と透明な背景で構成されます。私の意図は、画像の色を変更できるようにすることです。

答えて

5

ImageFilterはあなたの求めるものです。 GrayFilterを使うことができました。 createImageとコンポーネント(JComponentの)内部

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 
    } 
} 

使用法:

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

    } 

} 
関連する問題