设为首页 收藏本站
查看: 740|回复: 0

[经验分享] php版本 化妆程序 给图片添加饰物

[复制链接]

尚未签到

发表于 2017-4-10 10:46:51 | 显示全部楼层 |阅读模式
  大家估计都用手机玩过 化妆整人的程序
  也就是对照片加工处理 添加饰物 然后生成一张图片 可以搞笑娱乐大家
DSC0000.jpg

  本文主要采用的技术有
  1.jquery的拖拽 drag& drop技术
  2.PHP转换Json data
  3.CSS3 +HTML5
  首先我们建立一个大体的框架

<div id="content">
<div id="background" class="background">
<img id="obj_0" width="640" height="480" src="background.jpg"/>
</div>
<div id="tools">
</div>
<div id="objects">
<div class="obj_item">
<img id="obj_1" width="50" class="ui-widget-content" src="elements/bowtie.png" alt="el"/>
</div>
<div class="obj_item">
<img id="obj_2" width="50" class="ui-widget-content" src="elements/mus1.png" alt="el"/>
</div>
<div class="obj_item">
<img id="obj_3" width="50" class="ui-widget-content" src="elements/beard.png" alt="el"/>
</div>
</div>
<a id="submit"><span></span></a>
<form id="jsonform" action="merge.php" method="POST">
<input id="jsondata" name="jsondata" type="hidden" value="" autocomplete="off"></input>
</form>
</div>
  采用的css 

#content{
position:relative;
width:1105px;
height:500px;
margin:40px auto 0px auto;
background-color:#F9F9F9;
-moz-border-radius:6px;
-webkit-border-radius:6px;
border-radius:6px;
-moz-box-shadow:0px 0px 8px #ccc;
-webkit-box-shadow:0px 0px 8px #ccc;
box-shadow:0px 0px 8px #ccc;
}
.background{
position:absolute;
width:640px;
height:480px;
top:10px;
left:215px;
-moz-box-shadow:0px 0px 3px #bbb;
-webkit-box-shadow:0px 0px 3px #bbb;
box-shadow:0px 0px 3px #bbb;
}
  然后是拖拽的元素和图片的 css样式

#objects{
width:210px;
height:486px;
top:10px;
left:10px;
position:absolute;
}
.obj_item{
width:70px;
height:70px;
float:left;
}
#tools{
width:230px;
top:8px;
right:10px;
position:absolute;
height:420px;
overflow-y:scroll;
overflow-x:hidden;
}
.item{
border:3px solid #fff;
background-color:#ddd;
height:60px;
position:relative;
margin:2px 5px 2px 2px;
-moz-border-radius:3px;
-webkit-border-radius:3px;
border-radius:3px;
-moz-box-shadow:0px 0px 2px #999;
-webkit-box-shadow:0px 0px 2px #999;
box-shadow:0px 0px 2px #999;
}
.thumb{
width:50px;
height:50px;
margin:5px;
float:left;
}
.slider{
float: left;
width: 115px;
margin: 30px 0px 0px 5px;
background-color:#fff;
height:10px;
position:relative;
}
.slider span{
font-size:10px;
font-weight:normal;
margin-top:-25px;
float:left;
}
.slider span.degrees{
position:absolute;
right:-22px;
top:20px;
width:20px;
height:20px;
}
.slider .ui-slider-handle {
width:10px;
height:20px;
outline:none;
}
a.remove{
width:16px;
height:16px;
position:absolute;
top:0px;
right:0px;
background:transparent url(../images/cancel.png) no-repeat top left;
opacity:0.5;
cursor:pointer;
}
a.remove:hover{
opacity:1.0;
}
  饰品元素 被存储在json data中

var data = {
"images": [
{"id" : "obj_0" ,"src" : "background.jpg", "width" : "640", "height" : "480"}
]
};
  另外元素可以放大缩小 并且可以拖拽

$('#objects img').resizable({
handles : 'se',
stop    : resizestop
}).parent('.ui-wrapper').draggable({
revert  : 'invalid'
});

$('#background').droppable({
accept  : '#objects div', /* accept only draggables from #objects */
drop    : function(event, ui) {
var $this       = $(this);
++count_dropped_hits;
var draggable_elem = ui.draggable;
draggable_elem.css('z-index',count_dropped_hits);
/* object was dropped : register it */
var objsrc      = draggable_elem.find('.ui-widget-content').attr('src');
var objwidth    = parseFloat(draggable_elem.css('width'),10);
var objheight   = parseFloat(draggable_elem.css('height'),10);
/* for top and left we decrease the top and left of the droppable element */
var objtop      = ui.offset.top - $this.offset().top;
var objleft     = ui.offset.left - $this.offset().left;
var objid       = draggable_elem.find('.ui-widget-content').attr('id');
var index       = exist_object(objid);
if(index!=-1) { //if exists update top and left
data.images[index].top  = objtop;
data.images[index].left = objleft;
}
else{
/* register new one */
var newObject = {
'id'        : objid,
'src'       : objsrc,
'width'     : objwidth,
'height'    : objheight,
'top'       : objtop,
'left'      : objleft,
'rotation'  : '0'
};
data.images.push(newObject);
/* add object to sidebar*/
$('<div/>',{
className   :   'item'
}).append(
$('<div/>',{
className   :   'thumb',
html        :   '<img width="50" class="ui-widget-content" src="'+objsrc+'"></img>'
})
).append(
$('<div/>',{
className   :   'slider',
html        :   '<span>Rotate</span><span class="degrees">0</span>'
})
).append(
$('<a/>',{
className   :   'remove'
})
).append(
$('<input/>',{
type        :   'hidden',
value       :   objid       // keeps track of which object is associated
})
).appendTo($('#tools'));
$('.slider').slider({
orientation : 'horizontal',
max         : 180,
min         : -180,
value       : 0,
slide       : function(event, ui) {
var $this = $(this);
/* Change the rotation and register that value in data object when it stops */
draggable_elem.css({
'-moz-transform':'rotate('+ui.value+'deg)',
'-webkit-transform':'rotate('+ui.value+'deg)'
});
$('.degrees',$this).html(ui.value);
},
stop        : function(event, ui) {
newObject.rotation = ui.value;
}
});
}
}
});
  下面是整体的php文件

$res = JSON_decode(stripslashes($_POST['JSONdata']), true);
/* get data */
$count_images   = count($res['images']);
/* the background image is the first one */
$background     = $res['images'][0]['src'];
$photo1         = imagecreatefromjpeg($background);
$foto1W         = imagesx($photo1);
$foto1H         = imagesy($photo1);
$photoFrameW    = $res['images'][0]['width'];
$photoFrameH    = $res['images'][0]['height'];
$photoFrame     = imagecreatetruecolor($photoFrameW,$photoFrameH);
imagecopyresampled($photoFrame, $photo1, 0, 0, 0, 0, $photoFrameW, $photoFrameH, $foto1W, $foto1H);
/* the other images */
for($i = 1; $i < $count_images; ++$i){
$insert         = $res['images'][$i]['src'];
$photoFrame2Rotation = (180-$res['images'][$i]['rotation']) + 180;
$photo2         = imagecreatefrompng($insert);
$foto2W         = imagesx($photo2);
$foto2H         = imagesy($photo2);
$photoFrame2W   = $res['images'][$i]['width'];
$photoFrame2H   = $res['images'][$i]['height'];
$photoFrame2TOP = $res['images'][$i]['top'];
$photoFrame2LEFT= $res['images'][$i]['left'];
$photoFrame2    = imagecreatetruecolor($photoFrame2W,$photoFrame2H);
$trans_colour   = imagecolorallocatealpha($photoFrame2, 0, 0, 0, 127);
imagefill($photoFrame2, 0, 0, $trans_colour);
imagecopyresampled($photoFrame2, $photo2, 0, 0, 0, 0, $photoFrame2W, $photoFrame2H, $foto2W, $foto2H);
$photoFrame2    = imagerotate($photoFrame2,$photoFrame2Rotation, -1,0);
/*after rotating calculate the difference of new height/width with the one before*/
$extraTop       =(imagesy($photoFrame2)-$photoFrame2H)/2;
$extraLeft      =(imagesx($photoFrame2)-$photoFrame2W)/2;
imagecopy($photoFrame, $photoFrame2,$photoFrame2LEFT-$extraLeft, $photoFrame2TOP-$extraTop, 0, 0, imagesx($photoFrame2), imagesy($photoFrame2));
}
// Set the content type header - in this case image/jpeg
header('Content-type: image/jpeg');
imagejpeg($photoFrame, $targetfile);
imagedestroy($photoFrame);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362817-1-1.html 上篇帖子: 在PHP中使用Mysqli操作数据库 下篇帖子: PHP保存远程图片到本地的类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表