大家估计都用手机玩过 化妆整人的程序
也就是对照片加工处理 添加饰物 然后生成一张图片 可以搞笑娱乐大家
本文主要采用的技术有
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. **HTML**: `index.html` 是项目的...
接着,为了给人脸添加装饰物,我们需要定位到眼睛、嘴巴等关键点。OpenCV提供了`cv2.findContours()`函数来寻找图像中的轮廓,配合`cv2.drawContours()`可以画出这些轮廓。在本实验中,我们可能需要找到眼睛和嘴巴的...
种树源码微信小程序是一种基于微信小程序平台的互动应用,主要功能是模拟真实世界的种树活动,用户可以通过参与各种互动任务来"种植"虚拟树木,提高用户的参与度和娱乐性。这种小程序通常包含多种功能模块,如种植、...
本报告对 自行车轮饰物的运动轨迹进行研究,文件含问题背景,原理(手写推导和电子版推导)心得,整体思路,报告含截图,含matlab源码,另含有福建省地图绘制和面积拟合。物有所值,遇到问题可扫描文件中二维码进行...
在QQ空间的装扮中,用户可能会添加带有漂浮效果的文字或图片,使空间更具趣味性和个性化。 实现漂浮效果的核心技术涉及JavaScript和CSS。JavaScript通常用于控制元素的动态行为,如改变位置、速度和方向,而CSS则...
1. **版本兼容性**:不同版本的Word可能无法完全兼容所有特性,确保在分享文件时,接收者使用的Word版本能打开和编辑文档。 2. **保护和权限**:可以通过设置密码保护Word文档,防止未经授权的访问和修改。也可以...
利用LabVIEW,工程师可以构建定制的测试程序,精确控制实验条件,实时监控和记录数据,以满足标准要求。 "ISO_6452_2007橡胶或塑料涂覆织物 汽车内装饰物的雾气凝结性能的测定.pdf"这个文件很可能是标准的详细文本...
CAD书房饰物 儿童玩具模块 还蛮多的
梦幻水族馆是一款深受用户喜爱的屏保程序,它为电脑桌面带来了一片宁静而美丽的海底世界。在工作或休息之余,只需轻轻一点,就可以将自己沉浸在深蓝色的海洋之中,仿佛真的拥有了一座电子鱼缸。这款屏保程序不仅具有...
"max2062.jpg"文件则可能是该3D模型的预览图像,设计师或用户可以通过这张图片快速浏览模型的外观和细节。这种预览图对于展示模型的设计风格、颜色搭配以及质感等至关重要,尤其是在交流和分享设计成果时。 同时,...
这些小装饰物可能是各种形状或图案,在屏幕上以随机大小和路径移动,营造出一种动态的视觉效果,通常用于网站背景、网页互动元素或者简单的屏幕保护程序。 描述部分的信息重复了标题,没有提供额外的技术细节,但...
【玄关饰物选择与风水】\n\n玄关,作为住宅的第一道门户,其装饰物的选择至关重要,因为它直接影响到住宅的整体风水。在中国传统文化中,风水学认为玄关的布置可以影响到家庭的运势和成员的健康。因此,选择合适的...
在IT行业中,3D模型是一种数字艺术形式,用于创建虚拟物体或环境的三维表示。"工艺品3D装饰物"这个标题暗示我们关注的是一个专门针对装饰品设计的3D建模项目。3D模型广泛应用于游戏开发、室内设计、产品可视化、电影...
通过上述步骤,我们已经使用Python和vtk库创建了一个动态的3D圣诞树模型,并为其添加了旋转动画效果。我们从基本的3D建模开始,逐步添加了装饰物和动画效果。这个项目不仅展示了vtk库的强大功能,也提供了一个有趣的...
该人脸库是cas-peal的饰物子集,如果没有积分,可发送邮件索要。
【化妆比赛策划书】 本次化妆比赛的策划书围绕着一场以“化出你心中的另一半”为主题的活动展开,旨在提升学生们的艺术修养和实践能力,同时为校园文化氛围增添活力。活动选择在光棍节这一天举行,地点设在艺术楼...
《具有环形装饰物的通讯塔》是一份深入探讨电信设备设计与功能的资料,主要聚焦于一种特殊的通讯塔——带有环形装饰物的通讯塔。这种独特的设计不仅在视觉上引人注目,而且在实际操作中也有其独特的作用和意义。...
"行业分类-设备装置-可翻转饰物的趣味笔具.zip"这个标题和描述揭示了一个特定的产品类别,即一种结合了装饰性和实用性的书写工具。这种笔具的特点是拥有可翻转的饰物,为用户带来独特的互动体验和乐趣。 首先,我们...
这份《营业员饰物佩戴标准》不仅适用于超市,同样适用于其他零售行业,如服装店、化妆品专柜等。通过规范营业员的饰物佩戴,不仅可以提升店铺的整体形象,还能提高顾客满意度,从而促进销售业绩的提升。因此,对于...