其实这是一个很简单的问题,有大一的同学做课设的时候问我这个事,正好我在写课设的时候把代码都做成了函数,用起来还挺方便,也算是一个现成的补充方案,于是干脆把代码加上使用方法都发出来好了。
原理其实就是颜色代码的与或关系,这里不讲原理,只讲方法。中间的文件名是按照我写的程序来的,照着步骤一步步操作一定能用。
实际的实现方法有很多种,通过别的方式实现也是可以的。这里的方法只做参考。
图片处理部分:
该部分需要用到PS,下载安装PS的方法自行百度,或者找有PS的电脑用也可以。
文中涉及到的PS操作不明白的可以直接搜索引擎用“PS 关键字”的方式进行搜索。需要搜索的关键字我会用黑体标明。
其实这里面的操作用蒙版会好一些,不过蒙版要讲的东西比较多,这个方法虽然不够正式,但贵在好用简单没有门槛要学的东西少。
首先拿到一张图,裁剪好大小。
然后用【魔棒工具】【快速选择工具】【套索工具】【磁性套索工具】【多边形套索工具】中的一种或几种(不会用的直接百度关键词,使用很简单,下同)选中你想要显示的区域或者背景区域(图片里选中的事背景区域)(选中了一个区域之后,直接Ctrl+Shift+****i反选即可选中另一部分区域)。
按住Shift键之后选择可以把要选择的选区加入到选好的区域中;按住Alt键之后选择可以将选择的选区从已经选好的区域中去掉;几个工具可以交替使用。
然后用油漆桶或者画笔工具将背景填充为白色。白色必须是RGB值为FFFFFFH(十六进制数)的白色,也就是颜色那一栏全都是255,否则之后会出问题。
颜色:
然后保存图片,【格式为jpg格式,文件名为【文件名_a】,就是在你想要的文件名后面加一个下划线,然后加上a,这是代码需要,如果你不用我的代码可以不用管。后面有文件结构范例】
接着将背景区域颜色填充为黑色,同样黑色必须是000000的黑色,也就是RGB一栏全都是0,否则一样会出问题
然后Ctrl+Shift+i反选区域,将要显示的区域填充为上面所说的白色
保存图片,加上_b。
关于文件名,如果我希望我的文件名是myFish.jpg,那么经过处理之后的文件名以及文件是这个样子的
将处理好的文件直接放在和你的源代码同一个文件夹中。在VS2015下,文件结构是这个样子的:
对没错这是我的课设文件夹
代码部分:
函数的代码如下,所需要的库函数如果没有包含进去,可以直接搜索函数名,即可找到对应的库函数。代码可直接复制。如需要现成的cpp文件可以关注公众号后回复“透明图片代码”获取cpp文件下载地址:
struct ImageArray {
IMAGE a, b;
};
void loadimage_transparent(ImageArray &imageArray,TCHAR name[50],int width,int height) {
//*******convert module*********
//convert string "name" to "name_a.jpg" and "name_b.jpg"
TCHAR a[60], b[60];
int len;
wcslen(name);
wcscpy_s(a,60,name);
wcscpy_s(b,60,name);
wcscat_s(a, 60,_T("_a.jpg"));
wcscat_s(b, 60,_T("_b.jpg"));
// loadimage
//*******convert module finished*******
loadimage(&(imageArray.a), a, width, height,1);
loadimage(&(imageArray.b), b, width, height, 1);
}
void putimage_transparent(ImageArray &imageArray, int middle_x, int middle_y) {
int real_x, real_y;
real_x = middle_x - imageArray.a.getwidth()/2;
real_y = middle_y - imageArray.a.getheight()/2;
putimage(real_x, real_y, &(imageArray.a),0x00EE0086); //DSo
putimage(real_x,real_y, &(imageArray.b), 0x008800C6); //DSa
}
使用说明:
ImageArray为我自己定义的包含两个IMAGE的结构体(好吧其实用数组就可以不过我当时就是这么用的),该结构体配合下面的两个函数可以直接使用。
**void loadimage_transparent(ImageArray &imageArray,TCHAR name[50],int width,int height) **为读取图片的函数,参数说明:
ImageArray &imageArray为ImageArray的引用(不是指针,用的时候不需要加取地址符&,引用为C++语法部分),TCHAR name[50]为文件名(不加.jpg,不加_a,_b),width和height为你希望加载的图片的宽高。
void putimage_transparent(ImageArray &imageArray, int middle_x, int middle_y)为输出透明图片的函数,参数说明:
ImageArray &ImageArray为指向ImageArray的引用(同上),middle_x和middle_y为要输入图片的【中心坐标】。(EasyX输出图片用的是图片左上角的坐标,不过我觉得输出目标的时候输出中心坐标更容易计算一些)
使用范例
继续拿上面的文件结构举例,比如我想要输出myFish.jpg这张图,保存好的两个文件为myFish_a.jpg和myFish_b.jpg,需要的大小长高为11056,需要输出到坐标200,300**的位置。代码是这个样子的:
ImageArray myFish; //定义ImageArray结构体
loadimage_transparent(myFish, _T("myFish"), 110, 56); //读取图片,第一个参数myFish不需要加取地址符,第二个为文件名,要加双引号转换为TCHAN形式的字符串,外面的_T("myFish")为字符格式转换库函数,110和56为尺寸
putimage_transparent(myFish, 200, 300); //输出图片,myFish为引用,不需要加取地址符&,200,300为要输出目标的中点x,y坐标
使用的时候尺寸参数文件名可以按照自己的需要进行调整。
祝大家课设愉快。