改变RBG值并不意味着';他似乎不在C语言中工作
我应该通过获得3个颜色的平均值,然后将该平均值分配给每个RBG颜色(红色、蓝色、绿色),将RGB颜色更改为灰色,但它不起作用 首先,我将发布灰度部分的代码:改变RBG值并不意味着';他似乎不在C语言中工作,c,cs50,C,Cs50,我应该通过获得3个颜色的平均值,然后将该平均值分配给每个RBG颜色(红色、蓝色、绿色),将RGB颜色更改为灰色,但它不起作用 首先,我将发布灰度部分的代码: #include "helpers.h" // Convert image to grayscale void grayscale(int height, int width, RGBTRIPLE image[height][width]) { for(int i = 0; i < height; i++)
#include "helpers.h"
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
RGBTRIPLE rgbt = image[i][j];
BYTE average = (rgbt.rgbtBlue/3)+(rgbt.rgbtGreen/3)+(rgbt.rgbtRed);
*rgbt.rgbtBlue = *average;
*rgbt.rgbtGreen = *average;
*rgbt.rgbtRed = *average;
}
}
return;
}
错误消息如下所示:
间接寻址需要指针操作数('int'无效)
谢谢你的帮助(我知道cs50不是最好的课程,但哈佛文凭很有帮助!)。我想你想要这个:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
RGBTRIPLE rgbt = image[i][j];
BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
rgbt.rgbtBlue = average;
rgbt.rgbtGreen = average;
rgbt.rgbtRed = average;
image[i][j] = rgbt;
}
}
return;
}
因为您没有将rgbt.rgbtRed
除以3,而且无论如何,您应该首先添加所有值,然后将整个值除以3,这将防止舍入错误:
BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
这是错误的,您可以使用*
取消对非指针的引用:
*rgbt.rgbtBlue = *average;
你只需要:
rgbt.rgbtBlue = average;
最后但并非最不重要的一点是,您仍然需要通过添加以下内容来修改图像中的原始值:
image[i][j] = rgbt;
我想你想要这个:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
RGBTRIPLE rgbt = image[i][j];
BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
rgbt.rgbtBlue = average;
rgbt.rgbtGreen = average;
rgbt.rgbtRed = average;
image[i][j] = rgbt;
}
}
return;
}
因为您没有将rgbt.rgbtRed
除以3,而且无论如何,您应该首先添加所有值,然后将整个值除以3,这将防止舍入错误:
BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
这是错误的,您可以使用*
取消对非指针的引用:
*rgbt.rgbtBlue = *average;
你只需要:
rgbt.rgbtBlue = average;
最后但并非最不重要的一点是,您仍然需要通过添加以下内容来修改图像中的原始值:
image[i][j] = rgbt;
BYTE
不是指针AFAIK。您不能取消对它的引用。(rgbt.rgbtRed)
->(rgbt.rgbtRed/3)
为什么要到处添加一元运算符*
?你认为它是干什么的?*rgbt.rgbtBlue
->rgbt.rgbtBlue
(几个地方)*平均值
->平均值
(几个地方)字节
不是指针。您不能取消对它的引用。(rgbt.rgbtRed)
->(rgbt.rgbtRed/3)
为什么要到处添加一元运算符*
?你认为它能做什么?*rgbt.rgbtBlue
->rgbt.rgbtBlue
(几个地方)*average
->average
(几个地方)正常,但它告诉我“无法打开infle.bmp.”?(非常抱歉,我真的很烂:D)“无法打开infle.bmp.”,很可能意味着该文件不存在。文件名可能区分大小写,或者您的平台或文件在您认为的位置不存在。这是一个全新的问题。是的,我犯了一个愚蠢的错误,复制了代码前的空格,谢谢!我可以在这里问一个后续问题吗<代码>代码字节sepired=.393*rgbt.rgbtRed+.769*rgbt.rgbtGreen+.189*rgbt.rgbtBlue<代码>代码有错误信息;“259.821不在“unsigned char”类型的可表示值的范围内@Ragnaroni颜色值范围从0到255。您需要确保您的结果符合此范围。提示:应用基础学校数学。好的,它正在运行,但它告诉我“无法打开infle.bmp。”?(非常抱歉,我真的很烂:D)“无法打开infle.bmp.”,很可能意味着该文件不存在。文件名可能区分大小写,或者您的平台或文件在您认为的位置不存在。这是一个全新的问题。是的,我犯了一个愚蠢的错误,复制了代码前的空格,谢谢!我可以在这里问一个后续问题吗<代码>代码字节sepired=.393*rgbt.rgbtRed+.769*rgbt.rgbtGreen+.189*rgbt.rgbtBlue<代码>代码有错误信息;“259.821不在“unsigned char”类型的可表示值的范围内@Ragnaroni颜色值范围从0到255。您需要确保您的结果符合此范围。提示:应用基础学校数学。