有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java绘制图像的形状

在JavaSwing中,有没有办法只绘制图像的形状,而不是图像本身?如果是,我该怎么做

我添加了一张图片来告诉你我的意思: Click here

我的图像将由单色形状和透明背景组成。我的目的是能够改变图像的颜色


共 (2) 个答案

  1. # 1 楼答案

    ImageFilter就是你想要的。可以使用灰色过滤器

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

    使用createImage的组件(JComponent)中的用法:

    Image img = ImageIO.readImage(...);
    ImageFilter filter = new ShapeFilter();
    ImageProducer producer = new FilteredImageSource(img.getSource(), filter);
    Image img2 = createImage(producer);
    
  2. # 2 楼答案

    您可以生成图像的“遮罩”

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