vs2015 + EasyX 实现无背景贴图
来源:互联网 发布:骆家辉 杨澜 张欣 知乎 编辑:程序博客网 时间:2024/06/01 09:58
首先 有三张图片,一张背景图,我这里是两张人物图,现在要把人物图贴在背景里,并且去掉人物图片的背景,好让人物很好的嵌入到背景中,这两张图片的背景要是黑色的
只要思路就是,先要获得人物图的掩码图,就是黑白相间的图片,白色部分是要去掉的背景,黑色部分是要显示的人物,
下面是一个方法,传入IMAGE对象,返回掩码图的IMAGE对象,然后只用先后put到绘图设备中就可以了,
IMAGE qubeijing(IMAGE aa) {//SetWorkingImage(&aa);// 设置绘图目标为 aa 对象int width = aa.getwidth();int height = aa.getheight();//获取长和宽IMAGE maskbitmap(width, height); //创建一个掩码图DWORD *pmemflower = GetImageBuffer(&aa);DWORD *pmemmaskbitmap = GetImageBuffer(&maskbitmap);COLORREF maskbk = pmemflower[0];//这里0应该是左上角的像素的颜色值for (int i = 0; i<width * height; i++){if (pmemflower[i] <= 0x010101 && pmemflower[i] >= 0)//0x55555555是深灰色 xAAAAAA 浅灰 0XF5F5F5 烟白 && pmemflower[i] >= 0{pmemmaskbitmap[i] = WHITE ;//白色是背景,我想让背景少一点,大于的颜色越白,进这里的机会越少}elsepmemmaskbitmap[i] = BLACK;}//for 遍历每个像素值,如果颜色小于灰色 ,掩码图对应像素值为 纯白,否则为纯黑//得到 黑白相间 的掩码图return maskbitmap;}
put到绘图设备中时,先把掩码图put到绘图设备中
putimage(0, 280, &mni, SRCAND);
&mni 是 掩码图的引用,
SRCAND 在 EasyX文档里有说
SRCAND绘制出的像素颜色 = 屏幕颜色 AND 图像颜色注:
1. AND / OR / NOT / XOR 为布尔运算。
2. "屏幕颜色"指绘制所经过的屏幕像素点的颜色。
3. "图像颜色"是指通过 IMAGE 对象中的图像的颜色。
4. "当前填充颜色"是指通过 setfillcolor 设置的用于当前填充的颜色。
5. 查看全部的三元光栅操作码请点这里:三元光栅操作码。
//任意颜色 与 白色 做 与 运算 得到任意颜色
//任意颜色 与 黑色 做 与 运算 得到黑色
//任意颜色 与 白色 做 或 运算 得到白色
//任意颜色 与 黑色 做 或 运算 得到任意颜色
putimage(150, 280, &ni, SRCPAINT);
这里的 SRCPAINT 在文档上是这样说的
SRCPAINT绘制出的像素颜色 = 屏幕颜色 OR 图像颜色结合上面的说明, 黑色部分与任意颜色做 或 运算 得到任意颜色,这时候putimage 前后的两张图的黑色部分会被另一张图的颜色替换, 就OK了
我的资源文件是
// Microsoft Visual C++ generated resource script.//#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS#include "winres.h"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED#ifdef APSTUDIO_INVOKED1 TEXTINCLUDE BEGIN "resource.h\0"END2 TEXTINCLUDE BEGIN "#include ""winres.h""\r\n" "\0"END3 TEXTINCLUDE BEGIN "\r\n" "\0"END#endif // APSTUDIO_INVOKEDNI IMAGE "ni.jpg" //下面 引入的三个图片WO IMAGE "wo.jpg" gj IMAGE "bj.jpg"#endif // 中文(简体,中国) resources#ifndef APSTUDIO_INVOKED#endif // not APSTUDIO_INVOKED
在看代码#include "stdafx.h"#include <graphics.h> // 引用图形库头文件#include <conio.h>#include <windows.h>#include "resource.h"#include <iostream>using namespace std;IMAGE bj;IMAGE ni;IMAGE wo;void init(); //初始化函数IMAGE qubeijing(IMAGE aa);//去除背景 传入需要去背景的图片,传出去玩背景的图片void main(){init();//cout << _T("C:\\Users\\Administrator\\Desktop\\nn.jpg");/*initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素loadimage(NULL, _T("IMAGE"), _T("wo"));system("pause");*/return ;}void init() {//initgraph(1200,600); // 创建绘图窗口,大小为 640x480 像素loadimage(&bj, _T("IMAGE"), _T("gj"), 1200, 600);putimage(0, 0, &bj);//设置背景loadimage(&ni, _T("IMAGE"), _T("NI"),150,330); //宽150 高 300 loadimage(&wo, _T("IMAGE"), _T("WO"), 150, 330);//loadimage(NULL, _T("C:\\Users\\Administrator\\Desktop\\nn.jpg"));IMAGE mni=qubeijing(ni);BeginBatchDraw();//一会一块把图像刷新到屏幕putimage(0, 280, &mni, SRCAND);//and 的关系 ,白色and屏幕原色,出现原色 ,黑色and屏幕原色 ,出现黑色putimage(0, 280, &ni, SRCPAINT);// or 的 关系 //你绘制玩了IMAGE mwo = qubeijing(wo);putimage(150, 280, &mwo, SRCAND); //显示图片 距左 距上putimage(150, 280, &wo, SRCPAINT);FlushBatchDraw();EndBatchDraw();//circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100system("pause"); // 按任意键继续closegraph(); // 关闭绘图窗口}IMAGE qubeijing(IMAGE aa) {//SetWorkingImage(&aa);// 设置绘图目标为 aa 对象int width = aa.getwidth();int height = aa.getheight();//获取长和宽IMAGE maskbitmap(width, height); //创建一个掩码图DWORD *pmemflower = GetImageBuffer(&aa);DWORD *pmemmaskbitmap = GetImageBuffer(&maskbitmap);COLORREF maskbk = pmemflower[0];//这里0应该是左上角的像素的颜色值for (int i = 0; i<width * height; i++){if (pmemflower[i] <= 0x010101 && pmemflower[i] >= 0)//0x55555555是深灰色 xAAAAAA 浅灰 0XF5F5F5 烟白 && pmemflower[i] >= 0{pmemmaskbitmap[i] = WHITE ;//白色是背景,我想让背景少一点,大于的颜色越白,进这里的机会越少}elsepmemmaskbitmap[i] = BLACK;}//for 遍历每个像素值,如果颜色小于灰色 ,掩码图对应像素值为 纯白,否则为纯黑//得到 黑白相间 的掩码图return maskbitmap;}//任意颜色 与 白色 做 与 运算 得到任意颜色//任意颜色 与 黑色 做 与 运算 得到黑色//任意颜色 与 白色 做 或 运算 得到白色//任意颜色 与 黑色 做 或 运算 得到任意颜色
效果
素材是:
阅读全文
0 0
- vs2015 + EasyX 实现无背景贴图
- 使用easyx中的putimage函数实现无背景贴图
- [easyx游戏开发]---实现透明背景效果
- VS2015配置EasyX图形库
- VS2015 使用GDI+ 和 easyX的安装
- MFC 实现对话框 背景贴图的几种方式
- EasyX
- easyx
- EasyX实现圆球的反弹
- EasyX实现小球的移动
- VC背景贴图
- QPushButton QWidget 背景贴图
- MFC 对话框背景贴图
- 窗口背景贴图
- VS2015自定义编程背景
- Flex3:无边框透明背景MenuBar实现
- Cocos2d-x 背景重复贴图
- Qt背景贴图无法失效
- (168)景观表达式
- server responded “Algorithm negotiation failes” 报错问题解决办法,win7+ubuntu16.04
- JPA注解介绍
- API的接口变迁
- Magento2开发教程
- vs2015 + EasyX 实现无背景贴图
- Abstract class and interface
- Android系统分析之AsyncTask源码解析
- UITableViewCell左滑手势——给指定的Cell开启左滑手势
- HTML5开发实战之网易微博
- 理解SVG的缩放、偏移的计算公式
- linux(八)网络配置
- Magento2开发教程
- 【SDR】USRP使用过程中出现“U”、“O”的意义