BMP的学习

第一题: 寻找一个bmp图片,输出这张bmp图片第一个像素点和最后一个像素点的bgr的值

int main(int argc, const char *argv[])
{
	FILE* fp=fopen("./zzz.bmp","r");
	int bmp_size=0,bmp_w=0,bmp_h=0;
	fseek(fp,18,SEEK_SET);
	fread(&bmp_size,4,1,fp);
	printf("pictures size:%d\n",bmp_size);
	fseek(fp,18,SEEK_SET);
	fread(&bmp_w,4,1,fp);
	fread(&bmp_h,4,1,fp);
	printf("pictures geshi :%d * %d\n",bmp_w , bmp_h);
	fclose(fp);

// 读取第一个像素点
unsigned char bgr[3]; 
fseek(fp, 54, SEEK_SET); // 移动到像素数据开始位置
fread(bgr, 1, 3, fp); // 读取BGR值
printf("第一个像素点的BGR值: %d %d %d\n", bgr[2], bgr[1], bgr[0]);

// 计算最后一个像素点的位置
int width = bmp_w;
int height = bmp_h;
fseek(fp, 54+ (width * height - 1) * 3, SEEK_SET);
fread(bgr, 1, 3, fp);
printf("最后一个像素点的BGR值: %d%d%d\n", bgr[2], bgr[1], bgr[0]);
	return 0;
}

第二题: 修改一张bmp图片的大小,让他的宽度*2,高度*2,也就是最终像素点的数量*4,最后使用黑色像素点填充图片扩大的部分(不要求效果,只要求代码)

int main(int argc, const char *argv[])
{
	FILE* fp=fopen("aaa.bmp","r");
	int w=0,h=0;
	fseek(fp,18,SEEK_SET);
	fread(&w,4,1,fp);
	fread(&h,4,1,fp);
	printf("weight:%d height:%d\n",w,h);
	fclose(fp);
	FILE* wfp=fopen("aaa.bmp","r+");
	fseek(wfp,18,SEEK_SET);

	int nw=w*2;
	int nh=h*2;
	fwrite(&nw,4,1,fp);
	fwrite(&nw,4,1,fp);
	fseek(wfp,h*w,SEEK_SET);
	unsigned char bgr[3]={0,0,0};

	for(int i=0;i<nh;i++)
	{
		for(int j=0;i<nw;j++)
		{
			if(i>h&&j>w)
			{
				fwrite(bgr,3,1,wfp);
			}
		}
	}
	fclose(wfp);
	return 0;
}

第三题: 将一张bmp图片修改成德国的国旗(如下图)

int main(int argc, const char *argv[])
{
	FILE* fp=fopen("zzz.bmp","r");
	fseek(fp,2,SEEK_SET);
	int bmp_size=0;
	fread(&bmp_size,4,1,fp);
	printf("size:%d\n",bmp_size);

	int w=0,h=0;
	fseek(fp,18,SEEK_SET);
	fread(&w,4,1,fp);
	fread(&h,4,1,fp);
	printf("weight:%d height:%d\n",w,h);

	FILE* wfp=fopen("zzz.bmp","r+");

	fseek(wfp,54,SEEK_SET);
	fseek(fp,54,SEEK_SET);

	unsigned char b,g,r;

	unsigned char bgr1[3]={0,0,0},bgr2[3]={0,0,225},bgr3[3]={0,255,255};

	for(int i=0;i<h;i++)
	{
		for(int j=0;j<w;j++)
		{
			if(i==0&&j==0)
			{
				fread(&b,1,1,fp);
				fread(&g,1,1,fp);
				fread(&r,1,1,fp);
				printf("first red:%d green:%d blue:%d \n",r,g,b);
			}
			if(i==h&&j==w)
			{
				fseek(fp,54+w*h-1,SEEK_SET);
				fread(&b,1,1,fp);
				fread(&g,1,1,fp);
				fread(&r,1,1,fp);

				printf("end red:%d green:%d blue:%d \n",r,g,b);

			}
			if(i<h/3)
			{
				fwrite(bgr3,3,1,wfp);
			}
			else if(i>h/3&&i<.3*2)
			{
				fwrite(bgr2,3,1,wfp);
			}
			else if(i>h/3*2)
			{
				fwrite(bgr1,3,1,wfp);
			}
		}
	}
	fclose(fp);
	fclose(wfp);




	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值