CS50 pset4 filter(less comfortable) sepia函数输出异常原因咨询
CS50 pset4 filter(less comfortable)sepia函数异常原因分析
问题复现
你编写了两个版本的sepia滤镜函数,第一段代码编译无报错,但输出图片未呈现正确的sepia效果,第二段代码运行正常。
第一段问题代码
void sepia(int height, int width, RGBTRIPLE image[height][width]) { for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { RGBTRIPLE pixel={0,0,0}; RGBTRIPLE pix = image[i][j]; pixel.rgbtBlue = round(0.272 * pix.rgbtRed + 0.534 * pix.rgbtGreen + 0.131 * pix.rgbtBlue); pixel.rgbtGreen = round(0.349 * pix.rgbtRed + 0.686 * pix.rgbtGreen + 0.168 * pix.rgbtBlue); pixel.rgbtRed = round(0.393 * pix.rgbtRed + 0.769 * pix.rgbtGreen + 0.189 * pix.rgbtBlue); if(pixel.rgbtBlue > 255) { pixel.rgbtBlue = 255; } if(pixel.rgbtGreen > 255) { pixel.rgbtGreen = 255; } if(pixel.rgbtRed > 255) { pixel.rgbtRed = 255; } image[i][j] = pixel; } } return; }
第一段代码输出效果:
第二段正常代码
void sepia(int height, int width, RGBTRIPLE image[height][width]) { for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int red = image[i][j].rgbtRed; int green = image[i][j].rgbtGreen; int blue = image[i][j].rgbtBlue; //calculate sepia values int sepiaRed = round(.393 * red + .769 * green + .189 * blue); if(sepiaRed > 255) { sepiaRed = 255; } int sepiaGreen = round(.349 * red + .686 * green + .168 * blue); if(sepiaGreen > 255) { sepiaGreen = 255; } int sepiaBlue = round(.272 * red + .534 * green + .131 * blue); if(sepiaBlue > 255) { sepiaBlue = 255; } image[i][j].rgbtRed = sepiaRed; image[i][j].rgbtGreen = sepiaGreen; image[i][j].rgbtBlue = sepiaBlue; } } return; }
第二段代码输出效果:
差异根本原因
CS50定义的RGBTRIPLE结构体中,rgbtRed、rgbtGreen、rgbtBlue三个成员均为8位无符号整数(uint8_t),合法取值范围固定为0~255。
第一段代码的问题
计算得到的sepia颜色值先直接赋值给了pixel的uint8_t类型成员:
- 如果计算结果大于255,赋值给uint8_t类型变量时会直接发生溢出截断,仅保留低8位数值,比如计算结果为260,截断后会变成4,而非原值260
- 后续判断
pixel.rgbtRed > 255的逻辑永远不会触发,因为该变量已经被截断为0~255之间的值,超过范围的颜色值没有被正确限制为255,最终呈现异常颜色。
第二段代码正常的原因
计算得到的sepia颜色值先存储在int类型的临时变量中:
- int类型取值范围远大于255,不会发生溢出截断,计算得到的原值会被完整保留
- 判断值是否超过255的逻辑可以正常触发,超出范围的数值会被正确设置为255,最后再赋值给RGBTRIPLE的成员,结果符合sepia滤镜的预期。
内容的提问来源于stack exchange,提问作者Santhosh L
相关产品推荐
相关产品推荐

