2015-02-08 12 views
-3

我只是一個初學者,不知道爲什麼這兩個不同。如果有人能解釋,我會非常感激!謝謝!非常基本的C++代碼....但不明白

是什麼) 1之間的差

void Image::adjustbrightness(int r, int g, int b) 
{ 
    for (size_t x = 0; x < (*this).width(); x++) 
    {     
     if (r+f(x)->red <= 0) 
     f(x)->red = 0; 
     else if(r+f(x)->red >= 255)   
     f(x)->red = 255; 
     else 
     f(x)->red = r + f(x)->red; 
    } 
} 

和 2)

void Image::adjustbrightness(int r, int g, int b) 
{ 
    for (size_t x = 0; x < (*this).width(); x++) 
    {     
     f(x)->red = r + f(x)->red; 
     if f(x)->red <= 0) 
     f(x)->red = 0; 
     else if (f(x)->red>=255)    
     f(x)->red = 255; 
     else 

    } 
} 
+0

第二個不編譯,因爲第十一行已賁扯掉? – Quentin 2015-02-08 01:58:17

回答

1

第一個是在不正確的行爲,第二個是在語法:)

不正確

我認爲行爲應該是通過提供的值增加或減少圖像像素的亮度。像素的值可以在0255之間。

你的第一個版本試圖做到這一點,但它沒有將值保持在正確範圍內0-255之後它調整亮度。

你的第二個版本更好。它首先嚐試調整亮度,然後將值帶入0-255的正確範圍。然而,缺少代碼線路11上

正確的應該是:

void Image::adjustbrightness(int r, int g, int b) 
{ 
    for (size_t x = 0; x < (*this).width(); x++) 
    { 
     int adjustedRed = r + f(x)->red;     

     if (adjustedRed < 0) 
      adjustedRed = 0; 
     else if (adjustedRed > 255)    
      adjustedRed = 255; 

     f(x)->red = adjustedRed; 

     // above 8 lines can also be replaced by: 
     // f(x)->red = std::min(255, std::max(0, r + f(x)->red)); 

     // also, you will need to do the same with g(reen) and b(lue): 
     // auto pixel = f(x); 
     // pixel->red = std::min(255, std::max(0, r + pixel->red)); 
     // pixel->green = std::min(255, std::max(0, g + pixel->green)); 
     // pixel->blue = std::min(255, std::max(0, b + pixel->blue)); 
    } 
} 
0

最有可能的,因爲無論f(x)回報red成員是unsigned char,這是很常見的RGB顏色。

8位無符號字符的值範圍是從0到255.當您給它指定大於或小於它的值時,該值溢出並回繞。

這意味着在第二個示例中,您的if測試永遠不會是真的,並且(缺少)else子句將始終運行。這是因爲f(x)->red < 0永遠不會是真的。你的編譯器可能已經警告過你。

第一個示例工作的原因是表達式轉換爲int,因爲r是一個int。這意味着r + f(x)->red可以是< 0,因爲它是整數表達式,而不是無符號字符。

你的第二個例子中的一個版本的作品將中間結果存儲在一個整數,那麼這將讓比較正常工作:

void Image::adjustbrightness(int r, int g, int b) 
{ 
    for (size_t x = 0; x < (*this).width(); x++) 
    {     
     int newR = r + f(x)->red; 
     if (newR <= 0) 
      f(x)->red = 0; 
     else if (newR >= 255)    
      f(x)->red = 255; 
     else 
      f(x)->red = newR; 
    } 
} 

當然,這一切都假定f(x)->red是無符號的字符,該是你應該在原始問題中包含這些信息的原因。

0

代碼。你可以簡單理解像這樣:1 pixelRGB將編碼爲3 bytes1 byte for red,1 byte for​​and last 1 byte for blue。因爲1 byte = 8 bit,所以最大值是2^8 = 256。但它從0開始,所以變量的範圍將是0 -> 255

在你的代碼

,他們已檢查顏色的變化,他們不能超過255或小於0

2),同我在上面解釋,可能是f(x)->red只有1 byte,所以你需要檢查更改前的值。

這是示例

void Image::adjustbrightness(int r, int g, int b) 
{ 
    for (size_t x = 0; x < (*this).width(); x++) 
    { 
     f(x)->red = std::min(255, std::max(0, r + f(x)->red)); 
    } 
}