我在图像上添加了滤镜效果,我使用这段代码来实现它。但我不明白为什么我的变量不能这样工作

分享于2022年07月17日 c 问答
【问题标题】:我在图像上添加了滤镜效果,我使用这段代码来实现它。但我不明白为什么我的变量不能这样工作(im adding a filter effect on a image and i use this code to achieve it . but i dont understand why my variables dont work this way)
【发布时间】:2022-07-08 00:01:13
【问题描述】:

所以我写了这段代码

    void grayscale(int height, int width, RGBTRIPLE image[height][width])
{

 for (int i = 0 ; i < (height) ; i++)
    {
        for(int j = 0 ; j <(width); j ++){
            float blue = image[i][j].rgbtBlue;
            float green = image[i][j].rgbtGreen;
            float red = image[i][j].rgbtRed;
            int average_color = round((blue + green + red) /3);
            image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = average_color;
            // red = blue = green = average_color; WHY IS THAT WORNG INSTEAD OF THE LINE ABOVE?
        }
    }
    return;
}

在评论中,我第一次尝试了代码,但没有以这种方式获得 average_color 的值?

只有当我这样尝试时

            image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = average_color;

为什么 red=blu=green=avergae_color;不行吗?

  • 红色、蓝色和绿色不是 x,y 处像素的各自 R B G 分量。
  • 您是否希望红色、蓝色和绿色指向图像组件?
  • 是的,我认为他们会指向那里,出于纯粹的人类逻辑
  • 好吧,只有指针指向某个地方。 ;)

【解决方案1】:

让我们理解你的一个陈述

float blue = image[i][j].rgbtBlue;

此语句是 C 中的定义,即它是一个随后被实例化的声明。简单来说,声明通知编译器给定标识符 (blue) 与给定数据类型 (float) 相关联。当您使用赋值运算符为其赋值时,它会在进程堆栈中保留一个单独的内存空间,该空间将由您使用的标识符 (blue) 标识。显然,此内存地址与 image[i][j] 不同,需要进行平均,因此会出现这种行为。

也许您认为创建一个变量会使其指向赋值运算符的 RHS。虽然在某些语言(如 python 和 javascript)中确实如此,但 C 的行为并非如此。