图形信息处理作业一

要求:

1.读取一个彩色 bmp 文件,把 RGB 转化为 YUV。
2. 把 Y 值调整到[0,255]范围。
3. 写出灰度 bmp 格式图像
4. 改变 Y 值,再转化为 RGB 的 bmp 图像输出

#include <stdio.h>
#include <Windows.h>


void ToRGB(char* a, char* b)
{
	BITMAPFILEHEADER fileHeader;// 位图文件头
	BITMAPINFOHEADER infoHeader;// 位图信息头
	FILE* pFile = fopen(a, "rb");
	if (pFile == NULL)
	{
		printf("打开位图失败\n");
		exit(-1);
	}

	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);  //读取文件头
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);  //读取信息头
	WORD bitCount = infoHeader.biBitCount;  //颜色位数
	if (bitCount == 16)
	{
		exit(-1);
	}
	int Clr = 0;

	RGBQUAD *QUAD = NULL;
	if (bitCount < 16)
	{

		Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;
		if (Clr>256)
			Clr = 0;
	}
	// 读取调色板
	int i = 0, j = 0;
	if (Clr > 0)
	{
		QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);
		fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);
		for (i = 0; i < Clr; i++)
		{
			QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =
				(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);
		}
	}
	LONG pW = infoHeader.biWidth;     //图像数据的宽度
	LONG pH = infoHeader.biHeight;    //图像数据的高度

    int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小
	BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据
	int LineSize = ((pW * bitCount)>> 3);  //行数据大小
	fread(P, pSize, 1, pFile);     //存入图像数据
	if (Clr == 0)
	{
		for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW * 3; j = j + 3)// 列,因为每个像素占3个字节
                {
					int n = i*LineSize + j;
					int r = P[n];
					int g = P[n+1];
					int b = P[n + 2];

					int y = 0.299*r + 0.587*g + 0.114*b;
					int u = 0.492*(b - y);
					int v = 0.877*(r - y);
					y = y + 31;  //把所有像素点的y增大31
					/*if (y > 255)  //如果越界则置为255
						y = 255;
					if (y < 0)
						y = 0;
					if (u > 255)  //如果越界则置为255
						u = 255;
					if (u < 0)
						u = 0;
					if (v > 255)  //如果越界则置为255
						v = 255;
					if (v < 0)
						v = 0; */
					int R = y + 1.14*v;
					int G = y -0.394*u - 0.581*v;
					int B = y + 2.032*u;

					if (R > 255)  //R如果越界则置为255
						R = 255;
					if (R < 0)
						R = 0;
					if (G > 255)  //如果越界则置为255
						G = 255;
					if (G < 0)
						G = 0;
					if (B > 255)  //如果越界则置为255
						B = 255;
					if (B < 0)
						B = 0;
					P[n]  = (BYTE)(R); //分别是新r.g.b分量
					P[n + 1] = (BYTE)(G);
					P[n + 2] = (BYTE)(B);
				}
			}

		}
	}
	FILE* dFile = fopen(b, "wb");//创建目标文件

	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头

	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头
	if (QUAD)
	{
		fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);
	}
	//写入图像数据
	fwrite(P, pSize, 1, dFile);
	fclose(dFile);
	printf("处理完毕\n");
	if (QUAD)
	{
		free(QUAD);
		QUAD = NULL;
	}
	if (P)
	{
		free(P);
		P=NULL;
	}
}

void ToGrey(char* a, char* b)
{
	BITMAPFILEHEADER fileHeader;// 位图头文件
	BITMAPINFOHEADER infoHeader;// 位图信息头
	FILE* pFile = fopen(a, "rb");
	if (pFile == NULL)
	{
		printf("打开文件失败\n");
		exit(-1);
	}
	// 读取头信息
	fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);   //读取文件头
	fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);   //读取信息头
	WORD bitCount = infoHeader.biBitCount;//色彩的位数
	if (bitCount == 16)
	{
		exit(-1);
	}
	int Clr = 0;

	RGBQUAD *QUAD = NULL;
	if (bitCount < 16)
	{

		Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;
		if (Clr>256)
			Clr = 0;
	}
	// 读取调色板
	int i = 0, j = 0;
	if (Clr > 0)
	{
		QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);
		fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);
		for (i = 0; i < Clr; i++)
		{
			QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =
				(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);  //灰度图像三个都是y
		}
	}
	LONG pW = infoHeader.biWidth;     //图像数据的宽度
	LONG pH = infoHeader.biHeight;    //图像数据的高度

	int pSize = ((pW * bitCount)>>3)*pH;  //图像数据大小
	BYTE* P = (BYTE*)malloc(pSize);   //申请空间保存图像数据
	int LineSize = ((pW * bitCount)>> 3);  //行数据大小
	fread(P, pSize, 1, pFile);     //存入图像数据
	if (Clr == 0)
	{
		for (i = 0; i < pH; i++)//行
		{
			if (bitCount == 24)
			{
				for (j = 0; j < pW*3; j = j + 3)// 列
				{
					int n = i*LineSize + j;
					P[n] = P[n + 1] = P[n + 2] = (BYTE)(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]); //分别是r,g,b分量

				}printf("处理完毕");
			}

		}
	}

	FILE* dFile = fopen(b, "wb");//创建目标文件

	fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile);   //写入文件头

	fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile);  //写入文件信息头
	if (QUAD)
	{
		fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);
	}
	//写入图像数据
	fwrite(P, pSize, 1, dFile);
	fclose(dFile);
    printf("处理完毕\n");
	if (QUAD)
	{
		free(QUAD);
		QUAD = NULL;
	}
	if (P)
	{
		free(P);
		P = NULL;
	}
}

int main()
{
	ToGrey("a.bmp", "graya.bmp");
	ToRGB("a.bmp", "rgba.bmp");
    ToGrey("b.bmp", "grayb.bmp");
	ToRGB("b.bmp", "rgbb.bmp");
	ToGrey("c.bmp", "grayc.bmp");
	ToRGB("c.bmp", "rgbc.bmp");
	return 0;
}




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 计算机图形学课程作业 c 是一个压缩文件,使用.rar格式进行压缩。计算机图形学是研究计算机如何生成和处理图像的学科,作业c可能是课程中的一项任务或项目。通过下载作业c.rar文件,我们可以解压缩文件并获取其中的内容进行学习和分析。 要解压缩.rar文件,我们需要一个解压缩软件。常用的解压缩软件包括WinRAR、7-Zip等。我们可以将.c.rar文件保存到我们的计算机上,并右键单击该文件,选择使用解压缩软件进行解压操作。解压后,我们将获得一个或多个文件夹或文件,其中可能包含课程作业所需的代码、图像、文档等。 在计算机图形学课程中,作业c可能要求学生实现一些特定的图形处理算法或创建图像或动画等。根据具体的作业要求,我们需要仔细阅读相关的文档或说明文件,了解作业的目标和要求。 完成作业c时,我们可能需要使用计算机图形学相关的编程语言、开发工具和库,如OpenGL、DirectX、Python等。我们可以查阅课程教材或相关的在线资源,学习所需的知识和技术,然后按照作业要求编写代码或创建相应的图像。 最后,完成作业c后,我们需要将相关文件或文档打包压缩为一个.rar文件,并将其提交给教师或助教进行评估。通过这个过程,我们可以加深对计算机图形学的理解和应用,并提高自己的编程和图形处理技能。 ### 回答2: 计算机图形学课程作业 c.rar 是一个压缩文件,以.rar格式为扩展名。RAR是一种常用的文件压缩格式,用于将多个文件或文件夹打包成一个文件,以便于传输和存储。 对于这个计算机图形学课程作业c.rar文件,我们可以使用相应的解压缩软件(如WinRAR、7-Zip等)进行解压缩。解压缩后,我们可以得到原始的文件及文件夹,并能查看、编辑或使用其中的内容。 因为具体的计算机图形作业c.rar没有提供详细信息,所以无法对其内容和用途进行具体描述。然而,在计算机图形学课程中,常见的作业可能涉及到图像处理、渲染算法实现、三维建模等方面的内容。因此,解压缩后的文件可能包含这些方面的代码、图像、模型或其他相关资源。 为了完成这个作业,我们可以打开解压后的文件,查看其中的说明文档或代码文件,了解作业的要求和目标。根据要求,我们可以编写程序、设计图像效果或进行其他相应的操作。完成后,将结果保存并提交给授课教师或助教进行评估。 总之,计算机图形学课程作业c.rar是一个压缩文件,它包含了计算机图形作业相关的文件和资源。通过解压缩它,我们可以获得所需的内容,并进行相关的学习和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值