非常基本的c ++代码....但不明白

时间:2015-02-08 01:54:49

标签: 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

    }
} 

3 个答案:

答案 0 :(得分:1)

第一个行为不正确,第二个在语法上不正确:)

我认为行为应该是通过提供的值r来增加或减少图像像素的亮度。像素的值可以在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));
    }
} 

答案 1 :(得分:0)

最有可能因为red返回的f(x)成员是unsigned char,这对于RGB着色很常见。

8位无符号字符的值范围是0到255.当您为它指定大于或小于它的值时,该值会溢出并回绕。

这意味着在第二个示例中,if测试将永远不会为true,并且将始终运行(missing)else子句。这是因为f(x)->red&lt; 0永远不会是真的。您的编译器可能已经警告过您。

第一个示例的工作原因是表达式转换为int,因为r是一个int。这意味着r + f(x)->red可以&lt; 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是一个无符号字符,这就是为什么你应该在原始问题中包含这些信息的原因。

答案 2 :(得分:0)

代码。您可以这样简单理解:1 pixel中的RGB将使用3 bytes进行编码。 1 bytered1 bytegreen1 byteblue。因为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));
    }
}