EasyX趣味化编程note6,图片操作及文字

news2024/11/18 22:29:01

在这里插入图片描述

大家好这里是Dark FlameMaster
如果说前边所学的内容会给我们带来一定的乐趣,那么今天这篇可以说是最好玩的了,我们可以进一步改进写出小程序的好玩度,你甚至可以把身边的人或事写进一个小程序,制作一个小游戏,恶搞身边的人。

专栏在这里:EasyX趣味化编程

前言

前边所操作的都是EasyX图形库提供给我们的函数,利用这些函数可以进行相关的操作,从而绘制出相关的图片,达到趣味化编程的目的,而今天,你可以将一些美好事物的照片放进程序里(比如舍友的丑照),还可以将外界的歌曲放进程序里运行,比如数鸭子,嘿嘿


废话不多说,直接开始介绍。 EasyX支持 bmp / gif / jpg / png / tif / emf / wmf / ico格式的图片。 gif 格式的图片仅加载第一帧;gif 与 png 均不支持透明。如果不是这几种格式的图片,图形库就读取不到。

IMAGE对象可以保存图片的各类信息 我们可以这样创建一个IMAGE对象

IMAGE img;

填充显示IMAGE对象

void  loadimage(
	  IMAGE*pDstimg,
      LPCTSTR pImgFile,
      int nWidth=0;
      int nHeight=0,
      bool bResize=false
      );
  • 函数第一个参数为待填充的IMAGE指针
  • 第二个参数表示图片的路径
  • 第三个参数的图片的拉伸宽度,若参数为零,则使用原图宽度
  • 第四个参数为拉伸高度,若参数为零,则使用原图高度
  • 第五个参数为是否调整IMAGE的大小适应图片

在使用该函数时,要将默认的宽字节模式改为多字节字符
在这里插入图片描述
点击属性
在这里插入图片描述
高级->字符集->未设置
在这里插入图片描述
第二个参数传递的是图片路径,可以使用相对路径,将图片放在工程目录中,也可以使用绝对路径,输入图片在电脑中的具体位置。


绘制图片

创建一个窗体,将一张图片绘制在窗体内部。
首先选择自己喜欢的一张图片,打开后就可以看到该图片的像素
在这里插入图片描述
默认的打印位置的左上角在0,0处
将该图片复制到工程目录中。
在这里插入图片描述
右击文件,打开所在文件夹
在这里插入图片描述
将图片复制进去即可,可以重命名一下。
加载图片

IMAGE img;
loadimage(&img,"./test.png");

这里./表示在该工程目录中寻找,这样就将图片加载到img变量中了。
放置图片

void putimage(
    int dstX,
    int dstY,
    IMAGE*pSrcImg,
    DWORD dwRop=SRCCOPY
);
  • 前两个参数为绘制位置的x,y坐标
  • 第三个参数为要绘制的IMAGE指针,第四个参数表示三元光栅操作码

将刚刚的图片绘制在窗体上.
我们选择的图片像素比较大,我们可以将其拉伸至合适的宽度。

int main()
{
	initgraph(1000, 700);
	setbkcolor(RGB(156, 156, 156));
	cleardevice();
	IMAGE img;
	loadimage(&img, "test.jpg",1000,700);
	putimage(0, 0, &img);

	getchar();
	closegraph();
	return 0;
}

运行后效果如下
在这里插入图片描述
成功绘制图片


绘制不规则图片

只是绘制这些方方正正的图片我们一定不会满足,接下来介绍如何在背景上绘制出不规则图形的小人。
这里要强调一下,EasyX不能识别透明图片,我们可以利用三元光栅的方法进行绘制。
光栅运算法

首先要知道:
1, 黑色RGB(0,0,0)十六进制为0x000000。
2, 白色RGB(1,1,1)十六进制为0x111111。

首先我们要获得想要绘制的图形的原码和反码
在这里插入图片描述>制作原码和反码

微信公众号搜索小白资源库,里面有photoshop的安装包及详细安装流程。
在这里插入图片描述
在这里插入图片描述>原码和掩码如图。
掩码的外围为白色,中间为黑色,黑色与(&)上不管哪种颜色,它的颜色都是黑色,白色与上哪种颜色,他的颜色就为那种颜色。
例如:
外围白色与上RGB0x11001100,结果就为0x11001100。
里面的黑色与上RGB0x11001100,结果为0x000000。仍然为黑色。
先将掩码绘制在窗体上。图片不大,可以不放缩。
在这里插入图片描述
back即为内黑外围白的图片。
putimage的最后一个参数
在这里插入图片描述
设置绘制tutuback为与运算

int main()
{
	initgraph(1000, 700);
	setbkcolor(RGB(156, 156, 156));
	cleardevice();
	IMAGE img;
	loadimage(&img, "test.jpg",1000,700);
	putimage(0, 0, &img);
	IMAGE tutuback;
	loadimage(&tutuback, "tutuback.png");
	putimage(250, 250, &tutuback,SRCAND);

	getchar();
	closegraph();
	return 0;
}

运行后如图所示
在这里插入图片描述
再观察原码,原码的外围皆为白色,内边就是胡图图的脸,白色和任何颜色进行或运算,结果都仍为原来的颜色,内部的与黑色进行或运算,运行结果就为原来的颜色。
再次设置一个IMAGE的变量
这时的三元运算操作码为SRCPAINT,即或

int main()
{
	initgraph(1000, 700);
	setbkcolor(RGB(156, 156, 156));
	cleardevice();
	IMAGE img;
	loadimage(&img, "test.jpg",1000,700);
	putimage(0, 0, &img);
	IMAGE tutuback;
	loadimage(&tutuback, "tutuback.png");
	putimage(250, 250, &tutuback,SRCAND);
	IMAGE tutu;
	loadimage(&tutu, "tutu.png");
	putimage(250, 250, &tutu, SRCPAINT);
	getchar();
	closegraph();
	return 0;
}

运行后如图

在这里插入图片描述
很抱歉没画他的头发,秃顶图图也不错。
也可以将其抽离成一个函数,通过改变绘制图片的位置就可以使图片移动起来。
在这里插入图片描述
这里作者没有找到资源,也没时间画图,所及就拿这组来讲解一下,首先就要制作他们的掩码图片,将其命名改为mask1,mask2…,掩码图片每个后边都加一个back,创建IMAGE类型的数组,利用循环将其填充。在循环里有几张图片就只需要更改maski,i的值即可。然后绘制图片时利用循环及Sleep函数,当绘制到最后一张图片时,将i更改为0即可实现循环。要记住绘制完一帧图片之后就要cleardevice一次,再绘制下一组。
要实现向右移,只需要在循环里更改绘制时x的坐标即可。

文字

绘制文字
设置字体颜色函数

void settextcolor(COLORREF color);

默认写出的字是白色,我们创建白色窗体
利用设置字体颜色函数将字体颜色设置为黑色。
输出文本行函数

void outtextxy(
int x,
int y,
LPCTSTR str
);

第三个参数的原因,我们还要将字符集设置为空,解决汉字所占字符问题。
第三个参数为输出文本行的地址。

int main()
{
	initgraph(800,600);
	setbkcolor(WHITE);
	cleardevice();
	const char* p = "hello world 嘿";
	settextcolor(BLACK);
	outtextxy(0, 0, p);

	getchar();
	closegraph();
	return 0;
}

运行后如下
在这里插入图片描述
调整字体和字体大小

void settextstyle(
int nHeight,
int nWidth,
LPCTSTR lpszFace
);

第一个参数表示字体的宽度,第二个参数表示字体的高度,第三个参数表示字体的名称。
运行如图在这里插入图片描述>如果传入一个参数另一个为零,那就是自适应宽度
如图
在这里插入图片描述
这个函数只能默认在左上角打印文字,如果想在任意位置打印文字,就可以使用drawtext函数

int drawtext(
LPCTSTR str,
RECT* pRect,
UINT UFormat
);

  • 第一个参数表示待输出的字符串
  • 第二个参数表示指定的矩形区域指针
  • 第三个参数表示输出文字的方法

第二个参数为RECT*类型,RECT是一个结构体表示一个矩形区域
声明如下

typedef struct tagRECT
{
	long left;
	long top;
	long right;
	long bottom;
}RECT;

第三个参数大家有兴趣可以去文档中看,有很多输出类型
文档
第三个参数可以使用或运算符连接起来,实现更加丰富的功能。
举例

int main()
{
	initgraph(800,600);
	setbkcolor(WHITE);
	cleardevice();
	RECT rect;
	rect.left = 200;
	rect.top = 0;
	rect.right = 600;
	rect.bottom = 300;
	settextcolor(BLACK);
	settextstyle(80, 0, "微软雅黑");
	solidrectangle(rect.left, rect.top, rect.right, rect.bottom);
	const char* str = "你好,秃秃";
	drawtext(str, &rect, DT_CENTER);
	getchar();
	closegraph();
	return 0;
}

运行后如图
在这里插入图片描述
这是在矩形内剧中靠顶部显示,也可以其他形式显示,大家可以自行探索。

今天的文章就到这里啦,如果有什么问题欢迎大家讨论。
下一节讲一讲鼠标控制及音频播放,希望大家继续支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业级Netty网关,京东是如何架构的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近,尼恩指导一个小伙伴简历,写了一个《高并发网关项目》,此项目帮这个小伙拿到 字节/阿里/…

掌握Golang匿名函数

一个全面的指南,以理解和使用Golang中的匿名函数 Golang以其简单和高效而闻名,赋予开发人员各种编程范式。其中一项增强代码模块化和灵活性的功能就是匿名函数。在这篇正式的博客文章中,我们将踏上探索Golang匿名函数深度的旅程。通过真实世…

机器学习之Sigmoid函数

文章目录 Sigmoid函数是一种常用的数学函数,通常用于将实数映射到一个特定的区间。它的形状类似于"S"形状曲线,因此得名。Sigmoid函数在机器学习、神经网络和统计学中经常被使用,主要用于二元分类和处理概率值。 Sigmoid函数的一般…

【蓝桥】契合匹配

一、题目 1、题目描述 小蓝有很多齿轮,每个齿轮的凸起和凹陷分别用一个字符表示,一个字符串表示一个齿轮。 如果这两个齿轮的对应位分别是同一个字母的大小写,我们称这个两个齿轮是契合的。 例如:AbCDeFgh 和 aBcdEfGH 就是契合…

基于html+js编写的生命游戏

前言 本文将介绍一个基于htmljs的生命游戏,该项目只有一个html代码,无任何其他以来,UI方面采用了vueelement-plus进行渲染,游戏的界面基于canvas进行渲染,先来看一下成果。 我不知道游戏规则有没有写错,感…

Vue-3.2自定义创建项目

基于VueCli自定义创建项目架子 选择第三个 空格选中,再空格取消 选择vue2 其实就是mode模式,之后再去修改就可以,history和hash 选择less 无分号规范(标准化),目前最流行的 将配置文件放在单独的文件中 是否…

Linux环境配置安装Redis

Windows版本因官网不在提供与支持,以下基于linux环境安装 前提: 1.一台linux服务器 2.服务器已安装gcc 安装 1、官网下载 https://redis.io/download/ 对应压缩包 2、上传压缩包至服务器并解压缩 tar -zxvf redis-stable.tar.gz3、cd 至该目录下 4、…

双周总结#002 - 红树林

红树林公园,一棵单独生长在海岸边的树,下面一根根树立的幼苗,是从它的根茎上生长出来的。傍晚落潮后,会有一只只小螃蟹在这里浪荡。当然,也会有海鸟在这里进食。 文档 深入了解 Commonjs 和 Es Module1 Web 开发中&am…

两道关于顺序表的经典算法

文章目录 力扣:[移除元素](https://leetcode.cn/problems/remove-element/)[力扣:88. 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/) 力扣:移除元素 题目 给你一个数组 nums 和一个值 val,你需要 原地 移…

JAVA实战项目 超市商品管理系统

师傅开发的实战项目,感觉不错,拿出来分享分享。 目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型管理4.7 超市商…

JDBC操作BLOB类型字段

JDBC中Statement接口本身不能直接操作BLOB数据类型 操作BLOB数据类型需要使用PreparedStatement或者CallableStatement(存储过程) 这里演示通过PreparedStatement操作数据库BLOB字段 设置最大传入字节 一般是4M 可以通过以下命令修改 set global max_allowed_packet1024*1…

C语言,洛谷题,赦免战俘

先上答案&#xff0c;再对答案进行解释&#xff1a; #include <stdio.h> int arr[1025][1025] { 0 }; void fun(int bian,int x ,int y) {if (bian 2)//进入if再出去if之后&#xff0c;结束递归&#xff0c;因为递归在else里面{arr[x][y] 0;}else{int i 0;int j 0;…

【Linux】:Linux中Shell命令及其运行原理/权限的理解

Shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel 而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel沟通…

SpringCloud之Gateway整合Sentinel服务降级和限流

1.下载Sentinel.jar可以图形界面配置限流和降级规则 地址:可能需要翻墙 下载jar文件 2.引入maven依赖 <!-- spring cloud gateway整合sentinel的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-s…

从基础到卷积神经网络(第14天)

1. PyTorch 神经网络基础 1.1 模型构造 1. 块和层 首先&#xff0c;回顾一下多层感知机 import torch from torch import nn from torch.nn import functional as Fnet nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X torch.rand(2, 20) # 生成随机…

苍穹外卖(七) Spring Task 完成订单状态定时处理

Spring Task 完成订单状态定时处理, 如处理支付超时订单 Spring Task介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 应用场景: 信用卡每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 点外…

C++:多态讲解

多态 1.多态的概念2.多态的定义和实现2.1多态构成条件2.2虚函数2.3虚函数的重写(覆盖)2.4 C11 override 和 final2.5重载、重写(覆盖)、隐藏(重定义)的对比 3.抽象类4.多态的原理5.单继承和多继承关系的虚函数表5.1单继承5.2多继承5.3菱形继承和多态 1.多态的概念 多态的概念&…

【Vue面试题二十三】、你了解vue的diff算法吗?说说看

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;你了解vue的diff算法吗&…

MFC-对话框

目录 1、模态和非模态对话框&#xff1a; &#xff08;1&#xff09;、对话框的创建 &#xff08;2&#xff09;、更改默认的对话框名称 &#xff08;3&#xff09;、创建模态对话框 1&#xff09;、创建按钮跳转的界面 2&#xff09;、在跳转的窗口添加类 3&#xff0…

树莓派:64位 RPI OS(Bookworm) 更换国内源

几天前新的RPI OS发布了。官方的发版说明里明确注明已经基于Debian Bookworm了。总的来说切到国内源&#xff08;清华&#xff09;跟Bullseye差不多&#xff0c;细节上只有一丢丢不同&#xff08;non-free变成了non-free-firmware&#xff09;。 老规矩&#xff0c;仍然是修改…