亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用純 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 代碼。我們沒有將圖像更改為黑色和白色,而是將圖像更改為黑色和透明。這就是我們如何保護那些羽毛狀的邊緣。


http://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 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號