冰封的艺术

冰封的艺术

可以自定义字符串

然后开始冰封

完整代码如下:


// 程序名称:艺术字系列:冰封的艺术
// 编译环境:Visual Studio 2013,EasyX 2017-9-19
// 程序编写:鼠瓜
// 最后更新:2018-12-9
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>

// 定义全局变量
POINT *g_pDst;		// 点集(目标)
POINT *g_pSrc;		// 点集(源)
int g_nWidth;		// 文字的宽度
int g_nHeight;		// 文字的高度
int g_nCount;		// 点集包含的点的数量


// 获取目标点集
void GetDstPoints()
{
	// 设置临时绘图对象
	IMAGE img;
	SetWorkingImage(&img);
	// 定义目标字符串
	TCHAR s[15];
	InputBox(s, 15, _T("输入要冰封的字符串(<15个)"));		
	sscanf_s(" ", "%s", &s);		//获取输入的字符串
	// 计算目标字符串的宽高,并调整临时绘图对象的尺寸
	setcolor(WHITE);
	settextstyle(100, 0, _T("Arial"));		 //设置字体样式
	g_nWidth = textwidth(s);				// 获取字符串占用的像素宽
	g_nHeight = textheight(s);			   // 获取字符占用的像素宽
	Resize(&img, g_nWidth, g_nHeight);	  // 调整绘图设备的大小

	// 输出目标字符串至 img 对象
	outtextxy(0, 0, s);

	// 计算构成目标字符串的点的数量
	int x, y;
	g_nCount = 0;
	for (x = 0; x < g_nWidth; x++)
	for (y = 0; y < g_nHeight; y++)
	if (getpixel(x, y) == WHITE)
		g_nCount++;

	// 计算目标数据
	g_pDst = new POINT[g_nCount];
	int i = 0;
	for (x = 0; x < g_nWidth; x++)
	for (y = 0; y < g_nHeight; y++)
	if (getpixel(x, y) == WHITE)
	{
		g_pDst[i].x = x + (640 - g_nWidth) / 2;
		g_pDst[i].y = y + (480 - g_nHeight) / 2;
		i++;
	}

	// 恢复对屏幕的绘图操作
	SetWorkingImage(NULL);
}


// 获取源点集
void GetSrcPoints()
{
	// 设置随机种子
	srand((unsigned int)time(NULL));

	// 设置随机的源数据
	g_pSrc = new POINT[g_nCount];
	for (int i = 0; i < g_nCount; i++)
	{
		g_pSrc[i].x = rand() % 640;
		g_pSrc[i].y = rand() % 480;
	}
}


// 全屏模糊处理(忽略屏幕第一行和最后一行)
void Blur(DWORD* pMem)
{
	for (int i = 640; i < 640 * 479; i++)
	{
		pMem[i] = RGB(
			(GetRValue(pMem[i]) + GetRValue(pMem[i - 640]) + GetRValue(pMem[i - 1]) + GetRValue(pMem[i + 1]) + GetRValue(pMem[i + 640])) / 5,
			(GetGValue(pMem[i]) + GetGValue(pMem[i - 640]) + GetGValue(pMem[i - 1]) + GetGValue(pMem[i + 1]) + GetGValue(pMem[i + 640])) / 5,
			(GetBValue(pMem[i]) + GetBValue(pMem[i - 640]) + GetBValue(pMem[i - 1]) + GetBValue(pMem[i + 1]) + GetBValue(pMem[i + 640])) / 5);
	}
}


// 主函数
void main()
{
	// 初始化
	initgraph(640, 480);				// 创建绘图窗口看
	DWORD* pBuf = GetImageBuffer();		// 获取显存指针
	GetDstPoints();						// 获取目标点集
	GetSrcPoints();						// 获取源点集

	// 运算
	int x, y;
	for (int i = 2; i <= 256; i += 1)
	{
		COLORREF c = RGB(i - 1, i - 1, i - 1);		//此处用于改变字体颜色
												   //COLORREF c = WHITE;
		Blur(pBuf);						// 全屏模糊处理

		for (int d = 0; d < g_nCount; d++)		//此循环有深意,深究
		{
			x = g_pSrc[d].x + (g_pDst[d].x - g_pSrc[d].x) * i / 256;		
			y = g_pSrc[d].y + (g_pDst[d].y - g_pSrc[d].y) * i / 256;
			pBuf[y * 640 + x] = c;		// 直接操作显存画点
		}

		FlushBatchDraw();				// 使显存操作生效
		Sleep(20);						// 延时
	}

	// 清理内存
	delete g_pDst;
	delete g_pSrc;

	// 按任意键退出
	_getch();
	closegraph();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@Hwang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值