我需要打开/关闭图像的RGB通道,但是卡住了并且我的代码有错误。

您能帮我找出正确的方法吗?这是我的代码:

当3个复选框中的1个复选框更改其状态并提供true == selected自变量时,将调用函数通道

public void channels(boolean red, boolean green, boolean blue) {
    if (this.img != null) {// checks if the image is set
        char r = 0xFF, g = 0xFF, b = 0xFF;
        if (red == false) {
            r = 0x00;
        }
        if (green == false) {
            g = 0x00;
        }
        if (blue == false) {
            b = 0x00;
        }
        BufferedImage tmp = new BufferedImage(
                img.getWidth(),
                img.getHeight(),
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < img.getWidth(); i++) {
            for (int j = 0; j < img.getHeight(); j++) {
                int rgb = img.getRGB(i, j);
                int red = (rgb >> 16) & r;
                int green = (rgb >> 8) & g;
                int blue = (rgb >> 0) & b;
                int gbr = (red << 16) | (green << 8) | blue;// EDITED
                tmp.setRGB(i, j, gbr);
            }
        }
        img = tmp;
        repaint();
    } else {
        //show error
    }
}


谢谢您的帮助!

最佳答案

看来您错位了。不应该是:int gbr = (red << 16) | (green << 8) | blue;吗?基本上,您想以与开始时相同的顺序向后移。

同样,一旦清除了相应的颜色,就无法取回它。您需要将原始图像的副本存储在某处。当需要重新打开通道时,只需从原始图像中复制原始像素即可。

假设您将原始图像存储为origImg,我将修改您的for循环,以便如果打开通道,则从原始图像进行复制。

for (int i = 0; i < img.getWidth(); i++) {
    for (int j = 0; j < img.getHeight(); j++) {
        int rgb = img.getRGB(i, j);
        int origRGB = origImg.getRGB(i, j);
        int redPixel = red ? (origRGB >> 16) & r : (rgb >> 16) & r;
        int greenPixel = green ? (origRGB >> 8) & g : (rgb >> 8) & g;
        int bluePixel = blue ? origRGB & b : rgb & b;
        int gbr = (redPixel << 16) | (greenPixel << 8) | bluePixel;
        tmp.setRGB(i, j, gbr);
   }
}

关于java - 在RGB channel 之间切换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23690425/

10-15 05:53