二进制的骚操作-马赛克

 


#include<stdio.h>
//#include"swap.h"
#include<easyx.h>

//getpixel(x,y);//获取坐标位X和Y的像素点
//putpixel(x,y,color)//输出像素点
/*
图片?像素点?
像素点的本质是什么?颜色
存放在计算机里面,二进制  颜色在内存当中
4Byte 32位
00000000 00000000 00000000 00000000
a            b        g        r  //正确
alpha       red      green   blue  //错误
透明度       红      绿       蓝

*/
int main()
{
	//char filename[20] = { 0 };
	//printf("请输入图片名:");
	//scanf_s("%s", filename,10);
	
	IMAGE img;
	//loadimage(&img, filename);//把图片保存在img中
	loadimage(&img, "1.jpg");
	int width=img.getwidth();
	int height=img.getheight();
	initgraph(width, height);
	putimage(0, 0, &img);

	//主题:马赛克
	int size = 10;//一个晓方格的宽度
	int redsum;//一个格子里面每一个像素点的红色总和
	int greensum;
	int bluesum;
	int count;//一个格子中像素点的个数,剩下的一些边边
	int color;

	//遍历每一个小格子,x,y每个格子左上角坐标
	for (int y = 0; y < height; y += size)
	{
		for (int x = 0; x < width; x+=size)
		{
			//将数据清零
			redsum = greensum = bluesum = count = 0;

			//循环遍历小格子里的像素点
			for (int gy = y; gy < min(y+size,height); gy++)
			{
				for (int gx = x; gx < min(x+size,width); gx++)
				{
					int color = getpixel(gx, gy);//获取像素点  32位的数据
					redsum += color & 0xff;
					greensum += (color >> 8) & 0xff;
					bluesum+= (color >> 16) & 0xff;
					count++;
				}
			}//循环结束 小格子里面 数据全部统计完成
			redsum = redsum / count;
			greensum = greensum / count;
			bluesum = bluesum / count;
			color = (bluesum << 16) + (greensum << 8) + redsum;
			
			for (int gy = y; gy < min(y + size, height); gy++)
			{
				for (int gx = x; gx < min(x + size, width); gx++)
				{
					putpixel(gx, gy, color);
				}
			}
		}
	}


	for (int y = 0; y < height; y++)
	{
		for (int x = 0; x < width; x++)
		{
			int color = getpixel(x, y);//获取到每一个像素点

			//color = 0;//图片变成黑色的了
			//color = 0xffff01;//图片变成蓝色的了
			//color: 00000000 10010010  11101101 10101100
			//        00000000 00000000  00000000 11111111  &
			//----------------------------------------------------
			//                                    10101100

			//color: 00000000 00000000 10010010  11101101 
			//        00000000 00000000  00000000 11111111  &
			// ----------------------------------------------------
			//                                    10101100  
			int blue = (color >> 16) & 0xff;
			int green = (color >> 8) & 0xff;
			int red=color&0xff;//10101100

			//red = 0;//关掉红色通道
			//green = 0;//关掉红色通道

			//黑白:原理 (200+100+30)/3
			int rgb = (red + green + blue) / 3;

			//反色
			//rgb = 255 - rgb;
			color = (rgb << 16) + (rgb << 8) + rgb;
			
			//color = (blue << 16) + (green << 8) + red;
			putpixel(x, y, color);//像素点输出 
		}
	}
	


	//system("pause");
	while (1);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值