`

php版本 化妆程序 给图片添加饰物

阅读更多

大家估计都用手机玩过 化妆整人的程序

也就是对照片加工处理 添加饰物 然后生成一张图片 可以搞笑娱乐大家

 

 

 

本文主要采用的技术有

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);

 

  • 大小: 121.7 KB
3
1
分享到:
评论

相关推荐

    给头像加圣诞帽源码

    这个“给头像加圣诞帽源码”项目提供了一种方法,允许用户将不同样式的圣诞帽应用到他们的个人头像上,以此增加节日的喜庆感。以下是对这个项目涉及的技术知识点的详细解释: 1. **HTML**: `index.html` 是项目的...

    机器视觉实验四: 为人脸添加装饰物特效实验(OpenCV-python代码).zip

    接着,为了给人脸添加装饰物,我们需要定位到眼睛、嘴巴等关键点。OpenCV提供了`cv2.findContours()`函数来寻找图像中的轮廓,配合`cv2.drawContours()`可以画出这些轮廓。在本实验中,我们可能需要找到眼睛和嘴巴的...

    种树源码微信小程序的源码

    种树源码微信小程序是一种基于微信小程序平台的互动应用,主要功能是模拟真实世界的种树活动,用户可以通过参与各种互动任务来"种植"虚拟树木,提高用户的参与度和娱乐性。这种小程序通常包含多种功能模块,如种植、...

    matlab大作业自行车轮饰物的运动轨迹.rar

    本报告对 自行车轮饰物的运动轨迹进行研究,文件含问题背景,原理(手写推导和电子版推导)心得,整体思路,报告含截图,含matlab源码,另含有福建省地图绘制和面积拟合。物有所值,遇到问题可扫描文件中二维码进行...

    漂浮效果,漂浮效果的装饰物

    在QQ空间的装扮中,用户可能会添加带有漂浮效果的文字或图片,使空间更具趣味性和个性化。 实现漂浮效果的核心技术涉及JavaScript和CSS。JavaScript通常用于控制元素的动态行为,如改变位置、速度和方向,而CSS则...

    玄关饰物的选择.zip

    1. **版本兼容性**:不同版本的Word可能无法完全兼容所有特性,确保在分享文件时,接收者使用的Word版本能打开和编辑文档。 2. **保护和权限**:可以通过设置密码保护Word文档,防止未经授权的访问和修改。也可以...

    ISO 6452-2007汽车内装饰物的雾气凝结性能的测定.rar

    利用LabVIEW,工程师可以构建定制的测试程序,精确控制实验条件,实时监控和记录数据,以满足标准要求。 "ISO_6452_2007橡胶或塑料涂覆织物 汽车内装饰物的雾气凝结性能的测定.pdf"这个文件很可能是标准的详细文本...

    CAD书房饰物 儿童玩具模块

    CAD书房饰物 儿童玩具模块 还蛮多的

    屏保程序:梦幻水族馆

    梦幻水族馆是一款深受用户喜爱的屏保程序,它为电脑桌面带来了一片宁静而美丽的海底世界。在工作或休息之余,只需轻轻一点,就可以将自己沉浸在深蓝色的海洋之中,仿佛真的拥有了一座电子鱼缸。这款屏保程序不仅具有...

    时尚装饰物3D模型设计

    "max2062.jpg"文件则可能是该3D模型的预览图像,设计师或用户可以通过这张图片快速浏览模型的外观和细节。这种预览图对于展示模型的设计风格、颜色搭配以及质感等至关重要,尤其是在交流和分享设计成果时。 同时,...

    蓝天里随机大小的小装饰物翻飞飘落flash文件.rar

    这些小装饰物可能是各种形状或图案,在屏幕上以随机大小和路径移动,营造出一种动态的视觉效果,通常用于网站背景、网页互动元素或者简单的屏幕保护程序。 描述部分的信息重复了标题,没有提供额外的技术细节,但...

    玄关饰物的选择.doc

    【玄关饰物选择与风水】\n\n玄关,作为住宅的第一道门户,其装饰物的选择至关重要,因为它直接影响到住宅的整体风水。在中国传统文化中,风水学认为玄关的布置可以影响到家庭的运势和成员的健康。因此,选择合适的...

    工艺品3D装饰物

    在IT行业中,3D模型是一种数字艺术形式,用于创建虚拟物体或环境的三维表示。"工艺品3D装饰物"这个标题暗示我们关注的是一个专门针对装饰品设计的3D建模项目。3D模型广泛应用于游戏开发、室内设计、产品可视化、电影...

    实现装饰物的3D旋转效果:技术详解与Python代码实现

    通过上述步骤,我们已经使用Python和vtk库创建了一个动态的3D圣诞树模型,并为其添加了旋转动画效果。我们从基本的3D建模开始,逐步添加了装饰物和动画效果。这个项目不仅展示了vtk库的强大功能,也提供了一个有趣的...

    cas-peal人脸库饰物子集

    该人脸库是cas-peal的饰物子集,如果没有积分,可发送邮件索要。

    化妆比赛策划书.doc

    【化妆比赛策划书】 本次化妆比赛的策划书围绕着一场以“化出你心中的另一半”为主题的活动展开,旨在提升学生们的艺术修养和实践能力,同时为校园文化氛围增添活力。活动选择在光棍节这一天举行,地点设在艺术楼...

    电信设备-具有环形装饰物的通讯塔.zip

    《具有环形装饰物的通讯塔》是一份深入探讨电信设备设计与功能的资料,主要聚焦于一种特殊的通讯塔——带有环形装饰物的通讯塔。这种独特的设计不仅在视觉上引人注目,而且在实际操作中也有其独特的作用和意义。...

    行业分类-设备装置-可翻转饰物的趣味笔具.zip

    "行业分类-设备装置-可翻转饰物的趣味笔具.zip"这个标题和描述揭示了一个特定的产品类别,即一种结合了装饰性和实用性的书写工具。这种笔具的特点是拥有可翻转的饰物,为用户带来独特的互动体验和乐趣。 首先,我们...

    营业员饰物佩戴标准

    这份《营业员饰物佩戴标准》不仅适用于超市,同样适用于其他零售行业,如服装店、化妆品专柜等。通过规范营业员的饰物佩戴,不仅可以提升店铺的整体形象,还能提高顾客满意度,从而促进销售业绩的提升。因此,对于...

Global site tag (gtag.js) - Google Analytics