You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 PSet4模糊滤镜问题:运行后始终显示黑屏求排查建议

CS50 PSet4 模糊滤镜黑屏问题排查与修复

你的代码运行后出现黑屏,核心原因是循环逻辑错误和边界判断失误,以下是具体问题和修复方案:

关键错误点

  • 内层循环变量混淆:最内层的两个循环错误地使用外层的i和j作为终止条件,而非循环自身的变量a和b。这会直接篡改外层循环的索引变量,导致整个图像遍历逻辑彻底混乱。
    错误代码片段:

    for (int a = -1; i <= 1; i++)
    {
        for (int b = -1; j <= 1; j++)
    

    修正为:

    for (int a = -1; a <= 1; a++)
    {
        for (int b = -1; b <= 1; b++)
    }
    
  • 边界判断颠倒且范围错误:

    1. 行索引j + b的有效范围是0 <= j+b < height,列索引i + a的有效范围是0 <= i+a < width,你搞反了行、列对应的边界(把行和width比较,列和height比较)。
    2. 用>0代替>=0,会漏掉图像第一行和第一列的所有像素。
    3. 若边界判断错误导致blurredpx为0,后续除以0会得到NaN,赋值给RGB通道后会变成0,直接引发黑屏。
      错误代码片段:
    if (j + b > 0 && j + b < width && i + a > 0 && i + a < height)
    

    修正为:

    if (j + b >= 0 && j + b < height && i + a >= 0 && i + a < width)
    

修正后的完整代码

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE image_copy[height][width];
    // 复制原图像到临时数组,避免修改原数据影响计算
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            image_copy[j][i] = image[j][i];
        }
    }

    double red_val, blue_val, green_val;
    int blurredpx;

    // 遍历图像每个像素
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            red_val = 0;
            blue_val = 0;
            green_val = 0;
            blurredpx = 0;

            // 遍历当前像素的3x3邻域
            for (int a = -1; a <= 1; a++)
            {
                for (int b = -1; b <= 1; b++)
                {
                    // 检查邻域像素是否在图像有效范围内
                    if (j + b >= 0 && j + b < height && i + a >= 0 && i + a < width)
                    {
                        red_val += image_copy[j + b][i + a].rgbtRed;
                        blue_val += image_copy[j + b][i + a].rgbtBlue;
                        green_val += image_copy[j + b][i + a].rgbtGreen;
                        blurredpx++;
                    }
                }
            }

            // 计算平均值并四舍五入后赋值
            image[j][i].rgbtRed = lround(red_val / blurredpx);
            image[j][i].rgbtBlue = lround(blue_val / blurredpx);
            image[j][i].rgbtGreen = lround(green_val / blurredpx);
        }
    }
}

内容的提问来源于stack exchange,提问作者Peter Van Voorhis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:43:37