EasyX图形库,绘制透明和旋转图片的方法(效率很高) - 中華大帝

sdragonx 2021-08-29 原文


EasyX图形库,绘制透明和旋转图片的方法(效率很高)

#ifndef EX_EASYX_H
#define EX_EASYX_H

#include <graphics.h>

#define _USE_MATH_DEFINES
#include <math.h>

#ifndef M_RD
#define M_RD 0.01745329251994329576923690768489
#endif

//2x3矩阵
class gdimat2 : public XFORM
{
public:
	gdimat2()
	{
		this->identity();
	}

	void identity()
	{
		eM11 = 1.0f; eM12 = 0.0f;
		eM21 = 0.0f; eM22 = 1.0f;
		eDx = 0.0f; eDy = 0.0f;
	}

	void translate(float x, float y)
	{
		XFORM mat;
		mat.eM11 = 1.0f; mat.eM12 = 0.0f;
		mat.eM21 = 0.0f; mat.eM22 = 1.0f;
		mat.eDx = x;
		mat.eDy = y;
		CombineTransform(this, this, &mat);
	}

	void scale(float x, float y)
	{
		XFORM mat;
		mat.eM11 = x;    mat.eM12 = 0.0f;
		mat.eM21 = 0.0f; mat.eM22 = y;
		mat.eDx = 0.0f;
		mat.eDy = 0.0f;
		CombineTransform(this, this, &mat);
	}

	void rotate(float angle)
	{
		using namespace std;
		XFORM mat;
		angle *= M_RD;
		float cosin = cos(angle);
		float sine = sin(angle);
		mat.eM11 = cosin; mat.eM12 = sine;
		mat.eM21 = -sine; mat.eM22 = cosin;
		mat.eDx = 0.0f;
		mat.eDy = 0.0f;
		CombineTransform(this, this, &mat);
	}

	//应用到目标HDC
	void use(HDC dc)
	{
		SetWorldTransform(dc, this);
	}
};

//easyx扩展,绘制透明png图片
#pragma comment (lib, "MSIMG32.lib")
void draw_image(IMAGE& image, int x, int y, int w = -1, int h = -1)
{
	BLENDFUNCTION blendfunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
	int width = image.getwidth();
	int height = image.getheight();
	if (w == -1)w = width;
	if (h == -1)h = height;
	AlphaBlend(GetImageHDC(), x, y, w, h, GetImageHDC(&image), 0, 0, width, height, blendfunc);
}

//绘制旋转的图片,支持透明png图片
void rotate(IMAGE& image, int x, int y, int w, int h, float angle)
{
	//获取当前绘图dc
	HDC dc = GetImageHDC();
	//矩阵
	gdimat2 m;
	m.rotate(angle);	//旋转
	m.translate(x, y);	//平移
	m.use(dc);

	BLENDFUNCTION blendfunc = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
	int width = image.getwidth();
	int height = image.getheight();
	//绘制位置设置图片的中心点
	x = -w / 2;
	y = -h / 2;
	AlphaBlend(dc, x, y, w, h, GetImageHDC(&image), 0, 0, width, height, blendfunc);

	//初始化矩阵
	m.identity();
	//恢复dc初始变换
	m.use(dc);
}


#endif EX_EASYX_H

  

发表于
2021-03-28 17:51 
中華大帝 
阅读(245
评论(0
编辑 
收藏 
举报

 

版权声明:本文为sdragonx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sdragonx/p/14589321.html

EasyX图形库,绘制透明和旋转图片的方法(效率很高) - 中華大帝的更多相关文章

随机推荐

  1. 粒子群算法解决TSP问题

    1. 粒子群算法简介 粒子群算法(particle swarm optimization,PSO)由Kenne […]...

  2. LTE发射机ACLR性能的测量技术

    现代无线服务提供商正致力于不断扩大带宽,为更多用户提供互联网协议(IP)服务。长期演进技术(LTE)是对当前部 […]...

  3. IPv6简介

    https://segmentfault.com/a/1190000008794218 IPv6的优点 更大的 […]...

  4. HDD-FAT32 ZIP-FAT32

    在使用U当家U盘启动盘制作工具的时候会看到一个模式的选项,模式分为HDD-FAT32和ZIP-FAT32两个常 […]...

  5. 今日头条留个人微信号或微信公众号的方法

    今日头条官方后台对文章中包含的推广信息有明确规定:内容应该尽量精简,且与作者密切相关。只允许使用纯文字,控制在 […]...

  6. Mac Sourcetree克隆项目提示无效的url

    之前用SoucreTree拉去过另一个账号的git项目,今天创建了一个新的码云账号,克隆里面的项目是一直报错误 […]...

  7. 石家庄停车位在线预约平台07

    石家庄停车位在线预约平台07 下面是创建好的项目结构,我创建了bean包,测试类、和配置文件 idea可以自动 […]...

  8. 微信小程序数据类型及其方法作用

    小编刚刚接触小程序,所有东西全部看文档,多亏微信小程序的文档比较良心(Chinese),给我们带来了很大的遍历 […]...

展开目录

目录导航