彩色照片滤镜方法Java

时间:2014-02-28 06:54:21

标签: java types filter rgb photos

我正在尝试用Java编写一个方法,使用基本算法(没有比代码中已经更先进的算法)来比较两个像素(c1和c2)的亮度(r,g,b)。它需要从c1和c2中提取(r,g,b)值,比较并选择更亮的值,然后输出第三种颜色。这就是我所拥有的:

public static int combineBrighter(Color c1, Color c2) {
        int r = c1.getRed();
        int g = c1.getGreen();
        int b = c1.getBlue();

        int rr = c2.getRed();
        int gg = c2.getGreen();
        int bb = c2.getBlue();

        if(r >= rr){
        int rrr = r;    
        } else if(rr>=r) {
            int rrr = rr;
        }

        if(g >= gg){
            int ggg = g;    
            } else if(gg>=g) {
            int ggg = gg;
            }


        if(b >= bb){
            int bbb = b;    
            } else if(bb>=b) {
                int bbb = bb;
            }
        Color f = new Color(rrr, ggg, bbb);
        return f;

为什么它不起作用的任何想法?我收到一个错误,其中rrr,ggg和bbb不能作为整数插入到新的Color()中,但是如果我将它们切换到Color或其他类型,它会告诉我将它们切换回int。

1 个答案:

答案 0 :(得分:0)

这是一个范围问题。您的rrrgggbbb变量是在Color构造函数中使用它们时不可见的范围中定义的。

在程序的早期声明它们。

public static int combineBrighter(Color c1, Color c2) {
    int r = c1.getRed();
    int g = c1.getGreen();
    int b = c1.getBlue();

    int rr = c2.getRed();
    int gg = c2.getGreen();
    int bb = c2.getBlue();

    int rrr;               // declare them in this scope
    int ggg;
    int bbb;

    if(r >= rr){
      rrr = r;             // assign values later
    } else {
       rrr = rr;
    }

    ...

    Color f = new Color(rrr, ggg, bbb);
    return f;

以下是有关块范围的更多信息:http://www.cs.umd.edu/~clin/MoreJava/ControlFlow/block.html

但是,您可以使用三元?运算符同时声明和初始化它们。

int rrr = r >= rr ? r : rr;
int ggg = g >= gg ? r : gg;
int bbb = b >= bb ? r : bb;

但是,为什么重新发明轮子呢?这个更容易理解:

int maxRed   = Math.max(c1.getRed(),   c2.getRed());
int maxGreen = Math.max(c1.getGreen(), c2.getGreen());
int maxBlue  = Math.max(c1.getBlue(),  c2.getBlue());