【问题标题】:How to make the transparency transparent in Java graphics?如何使Java图形中的透明度透明?
【发布时间】:2017-10-05 06:36:02
【问题描述】:
 private static void convertTo2D(BufferedImage image, Graphics g, int locX, int locY, int sizeWidth, int sizeHeight) {
    int imageHeight = image.getHeight();
    int imageWidth = image.getWidth();
    Image img = image.getScaledInstance((sizeWidth), (sizeHeight), Image.SCALE_SMOOTH);
    image = new BufferedImage((sizeWidth), (sizeHeight), BufferedImage.TYPE_INT_RGB);
    image.getGraphics().drawImage(img, 0, 0, null);
    //The horizontal of image
    for(int x=0; x<(sizeWidth); x++) {
        //The vertical of image
        for(int y=0; y<(sizeHeight); y++) {
            //Get RGB color and draw it
            int color = image.getRGB(x, y);
            Color clr = new Color(color, true);
            g.setColor(clr);
            // Alpha = 0 - Fully Transparent
            if(clr.getAlpha() !=1) {
                g.drawLine((x + locX), (y + locY), (x + locX), (y + locY));
            }
        }
    }
}

这是我的代码。基本上,如果它是透明像素,我不希望它绘制像素(当您在谷歌上查看图像时,透明像素将是具有棋盘作为背景的像素)。我究竟做错了什么?目前这些图像的背景只是黑色,那么像素是否会被绘制出来呢?...

【问题讨论】:

标签: java graphics awt


【解决方案1】:

我会先绘制背景,然后在其上绘制图像,类似于...

protected BufferedImage makeImageFrom(BufferedImage original) {
    BufferedImage img = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = img.createGraphics();
    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
    g2d.setColor(Color.LIGHT_GRAY);
    int row = 0;
    for (int y = 0; y < img.getHeight(); y += 10) {
        int offset = (row % 2 == 0) ? 10 : 0;
        for (int x = 0; x < img.getWidth(); x += 20) {
            g2d.fillRect(offset + x, y, 10, 10);
        }
        row++;
    }
    g2d.drawImage(original, 0, 0, this);
    g2d.dispose();
    return img;
}

以及用于测试它的代码...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

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

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage img;

        public TestPane() throws IOException {
            BufferedImage original = ImageIO.read(get your own image);
            img = makeImageFrom(original);
        }

        protected BufferedImage makeImageFrom(BufferedImage original) {
            BufferedImage img = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = img.createGraphics();
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
            g2d.setColor(Color.LIGHT_GRAY);
            int row = 0;
            for (int y = 0; y < img.getHeight(); y += 10) {
                int offset = (row % 2 == 0) ? 10 : 0;
                for (int x = 0; x < img.getWidth(); x += 20) {
                    g2d.fillRect(offset + x, y, 10, 10);
                }
                row++;
            }
            g2d.drawImage(original, 0, 0, this);
            g2d.dispose();
            return img;
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null) {
                int x = (getWidth() - img.getWidth()) / 2;
                int y = (getHeight() - img.getHeight()) / 2;
                g.drawImage(img, x, y, this);
            }
        }

    }
}

我想我没有解释得最好。我的意思是,当背景是方格的(意味着它是一个透明的图像)时,背景应该是清晰的,并且只是在它后面的背景中绘制了任何东西。但是现在,它只会用黑色填充空白像素的其余图像高度和宽度?我该如何防止呢?朋友告诉我这与 Alpha 版有关?

如果你能提供一张你想要什么和你拥有什么的图片,我会非常高兴;P

我修改了上面的代码以使用透明图像作为默认基础,清除背景并像以前一样绘制其余部分...我还更改了TestPane 的背景颜色以验证它;)

protected BufferedImage makeImageFrom(BufferedImage original) {
    BufferedImage img = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = img.createGraphics();
    g2d.setBackground(new Color(255, 255, 255, 0));
    g2d.clearRect(0, 0, img.getHeight(), img.getHeight());
    g2d.setColor(Color.LIGHT_GRAY);
    int row = 0;
    for (int y = 0; y < img.getHeight(); y += 10) {
        int offset = (row % 2 == 0) ? 10 : 0;
        for (int x = 0; x < img.getWidth(); x += 20) {
            g2d.fillRect(offset + x, y, 10, 10);
        }
        row++;
    }
    g2d.drawImage(original, 0, 0, this);
    g2d.dispose();
    return img;
}

【讨论】:

  • 我想我没有解释得最好。我的意思是,当背景是方格的(意味着它是一个透明的图像)时,背景应该是清晰的,并且只是在它后面的背景中绘制了任何东西。但是现在,它只会用黑色填充空白像素的其余图像高度和宽度?我该如何防止呢?朋友告诉我这与 Alpha 版有关?
  • 完全道歉!没有图像很难解释,你是对的!基本上我有一个选择背景和这张图片:img00.deviantart.net/d9fa/i/2017/079/7/d/… 看,它如何将棋盘格作为背景意味着它是透明的?然后我想做的是在图形板上绘制图像,我希望传递透明度,这样像素就不会被绘制。当我目前这样做时,它会占用这些像素并使它们变黑。这更有意义吗?对所有的混乱感到抱歉!
  • 好的,我仍然不知道您要做什么 - 您是否正在尝试以某种方式屏蔽图像?一个更好的主意可能是提供您正在尝试做的事情的图像
  • “我仍然不知道你想做什么” 我(赞成你的答案,但是..)投票结束了这个问题。这里的信息太少了。
猜你喜欢
  • 2013-08-12
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多