2015-02-08 2 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

ответ

1

Первый неверно в поведении, второй неверно в синтаксисе :)

Я считаю, что поведение должно состоять в том, чтобы увеличить или уменьшить яркость пикселей изображения по предоставленному значению r. Пиксел может иметь значение между 0 и 255.

Ваша первая версия пытается это сделать, но не сохраняет значение точно в правильном диапазоне 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

Скорее всего потому, что red член любых f(x) возвращает это unsigned char, который является общим для RGB окраски.

Диапазон значений для 8-битного символа без знака - от 0 до 255. Когда вы присваиваете ему что-то большее или меньшее, значение переполняется и обтекает.

Это означает, что во втором примере ваш тест if никогда не будет истинным, и условие (missing) else будет всегда выполняться. Это связано с тем, что f(x)->red < 0 никогда не может быть правдой. Возможно, ваш компилятор предупредил вас об этом.

Причина, по которой первый пример заключается в том, что выражения преобразуются в int, поскольку r является int. Это означает, что r + f(x)->red может быть < 0, поскольку это целочисленное выражение, а не unsigned char.

версия вашего второго примера, который работает будет хранить промежуточный результат в целом числе, которое затем пусть сравнение работать правильно:

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 pixel в RGB будет закодирован с 3 bytes. 1 byte за red, 1 byte за green и последним 1 byte за 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)); 
    } 
} 
Смежные вопросы