如果在下面的代码片段中(在本文的底部),我需要编写一个将BMP转换为灰度的函数,我该怎么办?请注意,程序的main
已被写入,并且具有所有打开/关闭文件功能等。这仅需要函数本身。
我的作业要求将每个像素的红色,绿色和蓝色的值转换为这三个值的平均值,从而变得有些灰度,但甚至不知道如何开始。
包含以下库-再次注意,该库位于单独的文件中
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
这是我必须填写的代码段:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
return;
}
我一直在尝试以下可能的解决方案,但是我对image[height][width]
的使用似乎无效。然后,我当然需要用提供三个平均值的计算来代替0x00
。但是还不确定如何改进它。
{
if(( image[height][width].rgbtRed==0xff && image[height][width].rgbtBlue==0x00 && image[height][width].rgbtGreen==0x00)||(image[height][width].rgbtRed==0xff && image[height][width].rgbtBlue==0xff && image[height][width].rgbtGreen==0xff))
{
image[height][width].rgbtRed=0x00;
image[height][width].rgbtBlue=0x00;
image[height][width].rgbtGreen=0x00;
}
return;
}
(我很抱歉如果我的行话弄错了-我是一个非常新手的学习者。)
答案 0 :(得分:1)
您需要做的是计算每个像素的颜色,要么使用朴素的平均值,要么在评论中使用the formula 0.299R + 0.587G + 0.114B
suggested by @ Lee Daniel Crocker,要么使用some other method,然后设置{{ 1}} R
和G
像素都具有相同的值,并且图片是灰色的。
类似这样的东西
B
检查您的数据类型是否为无符号的,这样您就不会对有符号的字节弄乱超过127个值的加法不感到惊讶
答案 1 :(得分:0)
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int gray =
(image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0 ;
image[i][j].rgbtRed = gray ;
image[i][j].rgbtGreen = gray;
image[i][j].rgbtBlue = gray;
}
}
return;