Krissi

半亩方塘一鉴开,天光云影共徘徊。

[图像处理] 将图片转换为马赛克效果 铜牌收录

这个程序将图片转换为马赛克效果。

算法原理:求出每个小方块内所有像素的颜色平均值,然后用来设置为该小方块的颜色。依次处理每个小方块,即可实现马赛克效果。

完整代码如下:

/////////////////////////////////////////////////////////
// 程序名称:将图片转换为马赛克效果
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20200727
// 作    者:krissi <zh@easyx.cn>
// 最后修改:2013-4-22
//
#include <graphics.h>
#include <conio.h>

// 将图片转换为马赛克效果
// 参数:
//		pimg: 待处理的 IMAGE 对象指针
//		tilesize: 马赛克的尺寸
//		startx: 马赛克的平铺起始位置 x 坐标
//		starty: 马赛克的平铺起始位置 y 坐标
vo
...

[图像处理] 将图片进行模糊处理 铜牌收录

这个程序实现将图片进行模糊处理。

本程序的模糊处理算法:遍历图片像素,将每个像素颜色值与其周围像素颜色值求和,取平均值对其赋值。

完整代码如下(注意图片文件的路径):

/////////////////////////////////////////////////////////////////////////
// 程序名称:将图片进行模糊处理
// 编译环境:Visual C++ 6.0 ~ 2017,EasyX 20180727(beta)
// 作  者:krissi <zh@easyx.cn>
// 发布日期:2013-1-19
// 最后修改:2018-10-5
//
#include <graphics.h>
#include <conio.h>				

// 将图片进行模糊处理
void Blur(IMAGE *pimg)
{
	DWORD*	pMem = GetImageBuffer(pimg);

	int	r, g, b
...

[图像处理] 彩色图片转化成底片效果 铜牌收录

这个程序实现将图片转化成底片效果。

底片效果使用如下公式:

R = 0xFF - GetRValue(pMem[i]);
G = 0xFF - GetGValue(pMem[i]);
B = 0xFF - GetBValue(pMem[i]);

完整代码如下:

/////////////////////////////////////////////////////////
// 程序名称:底片效果
// 编译环境:Visual C++ 6.0 / 2010,EasyX_20200727
// 作    者:krissi <zh@easyx.cn>
// 最后修改:2013-1-20
//
#include <graphics.h>
#include <conio.h>

// 底片效果
void ColorInvert(IMAGE *pimg)
{	
	
...

[图像处理] 彩色图像转换为灰度图像 铜牌收录

这个程序实现将彩色图像转换为灰度图像。

彩色转换为灰度使用如下公式:

Gray = R * 0.299 + G * 0.587 + B * 0.114

为了提高运算速度,将这个公式转换为整数运算:

Gray = (R * 229 + G * 587 + B * 114 + 500) / 1000

为了提高运算速度的方法还有很多,这里作为演示,不再详述。
完整代码如下:

/////////////////////////////////////////////////////////
// 程序名称:彩色图片转换为灰阶图片
// 编译环境:Visual C++ 6.0 / 2010,EasyX 20130322(beta)
// 作    者:krissi <zh@easyx.cn>
// 最后修改:2013-1
...

禁用 EasyX 绘图窗口关闭按钮的方法(控制程序流程) 铜牌收录

目前,点 EasyX 绘图窗口的“关闭”,会直接退出整个程序。有时候,程序需要执行完整的流程,因此,禁止关闭按钮就是一个很需要的方法。

可以通过 initgraph 函数的第三个参数禁用关闭按钮,确保程序按实际流程完整执行。

以下代码禁用关闭按钮(VC6 / VC2010 编译通过):

#include <graphics.h>
#include <conio.h>

void main()
{
	initgraph(640, 480, NOCLOSE);

	circle(320, 240, 100);
	
	_getch();
	closegraph();
}

修改 VC 生成的 EXE 文件的图标 铜牌收录

Visual C++ 的控制台项目默认生成的 exe 图标很大众,本文讲解怎样修改 exe 文件的图标。

注:Visual C++ Express(学习版)不支持资源编辑,无法创建资源文件,也就无法添加图标资源。

基础知识

图标属于”资源“,需要依附在资源文件中。

如果创建的项目类型是 Win32 Application 并且不是空项目,那么项目中默认是有资源文件的。否则,就需要先创建资源文件,再添加图标资源。

步骤一:添加资源文件

首先,检查一下项目中是否存在资源文件。资源文件的扩展名是 .rc,如果你的项目名称为 test,通常资源文件的文件名为 test.rc。如果项目中存在资源文件,就不用再添加了,直接进行步骤二。

如果没有资源文件,请按照以下方法添加:

Visual C++ 6.0 这样做:

  1. 点菜单:File -> New...,选择 Files 中的 Resource Script,并
...

纪念披头士摇滚乐队(Beatles)的程序(VC 版本) 铜牌收录

西班牙程序员 Roman Cortes 用纯 javascript 脚本编写了一个纪念披头士摇滚乐队(Beatles)的程序,动态效果很是漂亮。现在,这个精彩的程序经 krissi 移植到了 vc 上。以下是执行效果抓图(炫丽的动态效果还是需要您亲自编译才能看到):

完整的 VC 源代码如下:

////////////////////////////////////////////////////////////////////
// 程序名称:纪念披头士摇滚乐队(Beatles)
// 编译环境:VC6.0 / 2010,EasyX 2011惊蛰版
// 原 作 者:西班牙程序员 Roman Cortes
// 原 程 序:http://www.romancortes.com/blog/a-tribute-to-the-beatles/ (javascript 版本)
// 移植作者:krissi <zh@easyx.cn>
// 最后修改:2012-3-5
//
...

在游戏中使用 midi 音乐文件 铜牌收录

关于什么是 midi 音乐文件,请参考百度百科:http://baike.baidu.com/view/7969.htm 。

这里简单说一说:

midi 是一种音乐文件,通常扩展名为 mid。不同于 mp3 的地方是:mp3 保存的是声音的波形数据,而 mid 保存的是乐器、音符、音调等。所以从文件体积上来说,mp3 的体积是 mid 体积的几十倍甚至上百倍。

鉴于 midi 的特点,早期很多游戏的都使用 midi 音乐。所以,本文讲怎样使用 midi 音乐。

【1. 素材获取】

网上搜索吧,网上有很多 mid 资源。但是不要尝试将 mp3 转换为 mid,由于原理不同,暂时无法实现 mp3 -> mid 的转换。

【2. 播放】

能播放 mp3 的方法,一般都可以用来播放 mid。所以,可以参考这些文章:

《在游戏中播放音乐》 http://www.easyx.cn/skills/View.aspx?id=44

《将 mp3 以资源形式嵌入 exe

...

情人节的红玫瑰 铜牌收录

2012年2月14日情人节就要来临了,西班牙程序员 Roman Cortes 用纯 javascript 脚本编写了红色玫瑰花。

现在,我把这个精彩的程序移植到了 VC 上。以下是执行效果:

完整的 VC 源代码如下:

////////////////////////////////////////////////////////////////////
// 程序名称:情人节的玫瑰
// 编译环境:VC6.0 / VC2010,EasyX_20210730
// 原 作 者:西班牙程序员 Roman Cortes
// 原 程 序:http://js1k.com/2012-love/demo/1022 (javascript 版本)
// 移植作者:krissi <zh@easyx.cn>
// 最后修改:2012-2-13
// 注:程序中的很多精简变量名都沿用原 javascript 中的变量名。
//
#include <graphics.
...

调色板动画程序(以 EasyX 平台举例) 铜牌收录

在 Turbo C 时代的图形编程有“调色板”的概念,但在真彩色时代,调色板的概念已经不完全相同了。

EasyX 模拟了 Turbo C 的大部分功能。由于上述原因,调色板并没有实现。如果要使用调色板,可以通过 Windows GDI 函数实现。

以下范例程序演示了这一过程:

(由于是动画程序,贴图无法展现效果,因此省略了贴图)

///////////////////////////////////////////////////
// 程序名称:基于 EasyX 的调色板动画程序
// 编译环境:VC6.0 / VC2010,EasyX 2011惊蛰版
// 作  者:krissi <zh@easyx.cn>
// 最后修改:2012-1-4
//
#include <graphics.h>
#include <conio.h>
#include <math.h>

#define	WIDTH	640
#define	
...

TC 中的 bioskey() 函数在 VC 中用什么代替? 铜牌收录

bioskey() 函数需要引用头文件 bios.h,这个头文件在 VC 中默认是没有的,将其引用 #include <bios.h> 删掉即可。

功能上,bioskey 可以实现以下三个功能:

  1. bioskey(0): 返回用户按键。
    如果返回值的低 8 位非 0,该值表示按键的 ASCII 码;
    如果返回值的低 8 位为 0,该值表示按键的键码。
    作为替代,VC 中可以使用 getch() 返回用户按键。对于功能键(如光标键),getch() 需要调用两次,第一次返回 0 或 0xE0,第二次返回键码。
    详见:http://msdn.microsoft.com/en-us/library/078sfkak(v=VS.80).aspx
  2. bioskey(1): 返回是否有按键发生。
    如果没有按键,返回 0;
    如果有按键,返回该按键值。(该按键仍然保留)
    作为替代,VC 中可以使用 kbhit() 返回是否有按键发生。
...

走迷宫程序(含自动迷宫生成) 铜牌收录

迷宫程序。执行效果如下:

程序间有足够多的注释,就不多作介绍了。代码如下:

///////////////////////////////////////////////////
// 程序名称:迷宫 游戏
// 编译环境:Visual C++ 6.0 / 2010,EasyX 2013霜降版
// 作  者:krissi <zhaoh1987@qq.com>
// 最后修改:2011-3-12
//
#include <graphics.h>
#include <time.h>



//////////////////////////////////////////////////////
// 定义全局变量
//
BYTE**	g_aryMap = NULL;			// 迷宫地图
SIZE	g_szMap;					// 迷宫地图的尺寸
IMAGE	g_imgSight(360, 280);		// 游戏的视野
RECT	g_rtSigh
...

模仿 Windows 屏保“变幻线 (Mystify)” VC 源代码 铜牌收录

该程序模仿的 Windows 经典屏幕保护程序“变幻线”,并使用了面向对象技术编写,初学面向对象时可以作为参考。

程序中,由多个连续的节点构成一个顶点对象,由四个顶点构成一个多边形对象,主程序有两个多边形在各自运动。更详细的,请参考源代码。

源代码如下:

// 程序名称:变幻线
// 编译环境:VC6 + EasyX v20100825
// 编 写 者:zhaoh1987@qq.com
// 编写日期:2010-11-25
//
#include <graphics.h>
#include <conio.h>
#include <time.h>
#define	WIDTH	640
#define	HEIGHT	480
#define	MAXSTEP	9



// 节点(多个连续的节点环,组成一个顶点)
struct POINTNODE
{
	POINT		pos;	// 位置
	POINTNODE*	next;	// 指向下一个节点的指针
}
...

学习编写一个完整的 Windows 应用程序 铜牌收录

从 C 语言,到常见的 setup.exe 安装程序,究竟有多远?怎样实现双击 .xls 文件会自动启动 excel 并加载?这篇文章就解释这个问题。

请跟随以下步骤:

  1. 编写应用程序。为了叙述方便,暂且叫 test.exe 吧。通常 test.exe 中会用若干 scanf 或 cin 来读取用户输入的参数,并根据参数来执行程序,这是大家在学习 C 语言的过程中见到的。

  2. 要规定程序所需数据的格式。例如,word 需要使用 .doc 格式的数据,photoshop 需要使用 .psd 格式的数据。不管这些数据文件是文本的还是二进制的,只有格式确定下来,程序才能按照原定意图解释数据。数据格式就是将用户输入的全部数据都放进一个文件中,然后将 scanf 语句修改为读取该文件(读文件的程序部分请参考相关书籍)。

  3. 设置文件关联。在上一步我们规定了一个我们需要的数据格式,现在给这个格式的文件自定一个扩展名,比如叫 .abc,然后双击该文件,Windows 会提示用户选择打开该类型

...