我正在尝试用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。
答案 0 :(得分:0)
这是一个范围问题。您的rrr
,ggg
和bbb
变量是在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());