为了账号安全,请及时绑定邮箱和手机立即绑定

使用纯 Java 模仿 JavaFX 的 ColorAdjust 亮度

使用纯 Java 模仿 JavaFX 的 ColorAdjust 亮度

UYOU 2023-03-02 16:07:40
我试图将彩色图像转换为可用的单色图像,但没有“锯齿状”边缘。从要求将图像从彩色转换为黑白的类似问题中,接受的答案之一提供了ColorAdjust使用setBrightness(-1)技术的 JavaFX 类中的简单技巧。这种技术的好处是保持黑色和白色之间的柔和边缘,例如支持高对比度主题而无需创建全新的图标集。注意:我确实理解这里“单色”这个词的不准确性(会出现一些灰度),但我不确定如何描述这种技术。使用纯 Java模仿该技术的方法是什么ColorAdust?期望:不需要:
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

这是一种纯 Java 方法。创建图像不需要 Swing 代码。我们没有将图像更改为黑色和白色,而是将图像更改为黑色和透明。这就是我们如何保护那些羽毛状的边缘。


//img1.sycdn.imooc.com//640059880001a0ec02800212.jpg

如果你想要一个没有 alpha 的真正的灰度图像,制作一个 graphics2d 对象,用所需的背景颜色填充它,然后将图像绘制到它上面。


至于将白人保留为白人,这是可以做到的,但必须承认两件事之一。要么放弃黑白方面并采用真正的灰度图像,要么保留黑白,但会出现锯齿状边缘,白色羽毛会融入任何其他颜色。发生这种情况是因为一旦我们击中浅色像素,我们如何知道它是浅色特征,还是白色和另一种颜色之间的过渡像素。我不知道有什么方法可以在没有边缘检测的情况下解决这个问题。


public class Main {

    private static void createAndShowGUI() {

        //swing stuff

        JFrame.setDefaultLookAndFeelDecorated(true);

        JFrame frame = new JFrame("Alpha Mask");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.PAGE_AXIS));


        JLabel picLabel = new JLabel(new ImageIcon(getImg()));

        frame.getContentPane().add(picLabel);


        BufferedImage alphaMask = createAlphaMask(getImg());


        JLabel maskLabel = new JLabel(new ImageIcon(alphaMask));

        frame.getContentPane().add(maskLabel);


        //Display the window.

        frame.pack();

        frame.setVisible(true);

    }


    public static BufferedImage getImg() {

        try {

            return ImageIO.read(new URL("https://i.stack.imgur.com/UPmqE.png"));

        } catch (IOException e) {

            e.printStackTrace();

        }

        return null;

    }


    public static BufferedImage createAlphaMask(BufferedImage img) {

        //TODO: deep copy img here if you actually use this

        int width = img.getWidth();

        int[] data = new int[width];


        for (int y = 0; y < img.getHeight(); y++) {

            // pull down a line if argb data

            img.getRGB(0, y, width, 1, data, 0, 1);

            for (int x = 0; x < width; x++) {

                //set color data to black, but preserve alpha, this will prevent harsh edges

                int color = data[x] & 0xFF000000;

                data[x] = color;

            }

            img.setRGB(0, y, width, 1, data, 0, 1);

        }

        return img;

    }


    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(() -> createAndShowGUI());

    }

}


查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号