2014-02-28 55 views
0

我想用Java編寫一種方法,使用比較兩個像素(r,g,b)的亮度的基本算術(沒有比代碼中已有的更高級的方法),c1和C2。它需要從c1和c2中拉出(r,g,b)值,比較並選取較亮的一個,然後輸出第三種顏色。這是我有什麼:彩色照片濾鏡方法Java

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或其他類型,它會告訴我將它們切換回整數。

回答

0

這是一個範圍界定問題。您的rrr,gggbbb變量定義在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()); 
+0

Math.max()肯定是去這裏的路。對於你編輯我在if語句之前初始化變量的例子,你還必須將它們初始化爲:「int rrr = 0;」。謝謝。 –

+0

您在聲明時沒有/必須初始化_if_所有代碼路徑在使用之前都爲它們分配一個值。這就是爲什麼我把你的'else if'改爲'else'。 –