我只是一个初学者,不知道为什么这两个是不同的。如果有人能解释,我会非常感激!谢谢!
有什么区别 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 :(得分: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));
}
}
答案 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 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));
}
}