• 技术文章 >web前端 >H5教程

    HTML5技术实现剪切+上传图片的功能

    2016-05-17 09:08:25原创1186
    我们曾经被几个读者问到同一个问题——如何将照片传到网上。我认为这是一个很有趣的问题,我决定在本文中解决掉这个问题。但是,我认为只是单纯的实现上传功能可能会有些单调,所以我决定添加一个很重要的元素—剪切功能。相信这样应该更有魅力的说。


    html

    第一步,我们先画一个表头










    现在再描绘主体部分











    Step1: Please select image file







    Step2: Please select a crop region

















    CSS

    .bheader {
    background-color: #DDDDDD;
    border-radius: 10px 10px 0 0;
    padding: 10px 0;
    text-align: center;
    }
    .bbody {
    color: #000;
    overflow: hidden;
    padding-bottom: 20px;
    text-align: center;

    background: -moz-linear-gradient(#ffffff, #f2f2f2);
    background: -ms-linear-gradient(#ffffff, #f2f2f2);
    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f2f2f2));
    background: -webkit-linear-gradient(#ffffff, #f2f2f2);
    background: -o-linear-gradient(#ffffff, #f2f2f2);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2');
    -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2')";
    background: linear-gradient(#ffffff, #f2f2f2);
    }
    .bbody h2, .info, .error {
    margin: 10px 0;
    }
    .step2, .error {
    display: none;
    }
    .error {
    font-size: 18px;
    font-weight: bold;
    color: red;
    }
    .info {
    font-size: 14px;
    }
    label {
    margin: 0 5px;
    }
    input {
    border: 1px solid #CCCCCC;
    border-radius: 10px;
    padding: 4px 8px;
    text-align: center;
    width: 70px;
    }
    .jcrop-holder {
    display: inline-block;
    }
    input[type=submit] {
    background: #e3e3e3;
    border: 1px solid #bbb;
    border-radius: 3px;
    -webkit-box-shadow: inset 0 0 1px 1px #f6f6f6;
    box-shadow: inset 0 0 1px 1px #f6f6f6;
    color: #333;
    font: bold 12px/1 "helvetica neue", helvetica, arial, sans-serif;
    padding: 8px 0 9px;
    text-align: center;
    text-shadow: 0 1px 0 #fff;
    width: 150px;
    }
    input[type=submit]:hover {
    background: #d9d9d9;
    -webkit-box-shadow: inset 0 0 1px 1px #eaeaea;
    box-shadow: inset 0 0 1px 1px #eaeaea;
    color: #222;
    cursor: pointer;
    }
    input[type=submit]:active {
    background: #d0d0d0;
    -webkit-box-shadow: inset 0 0 1px 1px #e3e3e3;
    box-shadow: inset 0 0 1px 1px #e3e3e3;
    color: #000;
    }

    JS

    // convert bytes into friendly format
    function bytesToSize(bytes) {
    var sizes = ['Bytes', 'KB', 'MB'];
    if (bytes == 0) return 'n/a';
    var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
    return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
    };

    // check for selected crop region
    function checkForm() {
    if (parseInt($('#w').val())) return true;
    $('.error').html('Please select a crop region and then press Upload').show();
    return false;
    };

    // update info by cropping (onChange and onSelect events handler)
    function updateInfo(e) {
    $('#x1').val(e.x);
    $('#y1').val(e.y);
    $('#x2').val(e.x2);
    $('#y2').val(e.y2);
    $('#w').val(e.w);
    $('#h').val(e.h);
    };

    // clear info by cropping (onRelease event handler)
    function clearInfo() {
    $('.info #w').val('');
    $('.info #h').val('');
    };

    function fileSelectHandler() {

    // get selected file
    var oFile = $('#image_file')[0].files[0];

    // hide all errors
    $('.error').hide();

    // check for image type (jpg and png are allowed)
    var rFilter = /^(image\/jpeg|image\/png)$/i;
    if (! rFilter.test(oFile.type)) {
    $('.error').html('Please select a valid image file (jpg and png are allowed)').show();
    return;
    }

    // check for file size
    if (oFile.size > 250 * 1024) {
    $('.error').html('You have selected too big file, please select a one smaller image file').show();
    return;
    }

    // preview element
    var oImage = document.getElementById('preview');

    // prepare HTML5 FileReader
    var oReader = new FileReader();
    oReader.onload = function(e) {

    // e.target.result contains the DataURL which we can use as a source of the image
    oImage.src = e.target.result;
    oImage.onload = function () { // onload event handler

    // display step 2
    $('.step2').fadeIn(500);

    // display some basic image info
    var sResultFileSize = bytesToSize(oFile.size);
    $('#filesize').val(sResultFileSize);
    $('#filetype').val(oFile.type);
    $('#filedim').val(oImage.naturalWidth + ' x ' + oImage.naturalHeight);

    // Create variables (in this scope) to hold the Jcrop API and image size
    var jcrop_api, boundx, boundy;

    // destroy Jcrop if it is existed
    if (typeof jcrop_api != 'undefined')
    jcrop_api.destroy();

    // initialize Jcrop
    $('#preview').Jcrop({
    minSize: [32, 32], // min crop size
    aspectRatio : 1, // keep aspect ratio 1:1
    bgFade: true, // use fade effect
    bgOpacity: .3, // fade opacity
    onChange: updateInfo,
    onSelect: updateInfo,
    onRelease: clearInfo
    }, function(){

    // use the Jcrop API to get the real image size
    var bounds = this.getBounds();
    boundx = bounds[0];
    boundy = bounds[1];

    // Store the Jcrop API in the jcrop_api variable
    jcrop_api = this;
    });
    };
    };

    // read selected file as DataURL
    oReader.readAsDataURL(oFile);
    }

    PHP

    function uploadImageFile() { // Note: GD library is required for this function

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $iWidth = $iHeight = 200; // desired image result dimensions
    $iJpgQuality = 90;

    if ($_FILES) {

    // if no errors and size less than 250kb
    if (! $_FILES['image_file']['error'] && $_FILES['image_file']['size'] < 250 * 1024) {
    if (is_uploaded_file($_FILES['image_file']['tmp_name'])) {

    // new unique filename
    $sTempFileName = 'cache/' . md5(time().rand());

    // move uploaded file into cache folder
    move_uploaded_file($_FILES['image_file']['tmp_name'], $sTempFileName);

    // change file permission to 644
    @chmod($sTempFileName, 0644);

    if (file_exists($sTempFileName) && filesize($sTempFileName) > 0) {
    $aSize = getimagesize($sTempFileName); // try to obtain image info
    if (!$aSize) {
    @unlink($sTempFileName);
    return;
    }

    // check for image type
    switch($aSize[2]) {
    case IMAGETYPE_JPEG:
    $sExt = '.jpg';

    // create a new image from file
    $vImg = @imagecreatefromjpeg($sTempFileName);
    break;
    case IMAGETYPE_PNG:
    $sExt = '.png';

    // create a new image from file
    $vImg = @imagecreatefrompng($sTempFileName);
    break;
    default:
    @unlink($sTempFileName);
    return;
    }

    // create a new true color image
    $vDstImg = @imagecreatetruecolor( $iWidth, $iHeight );

    // copy and resize part of an image with resampling
    imagecopyresampled($vDstImg, $vImg, 0, 0, (int)$_POST['x1'], (int)$_POST['y1'], $iWidth, $iHeight, (int)$_POST['w'], (int)$_POST['h']);

    // define a result image filename
    $sResultFileName = $sTempFileName . $sExt;

    // output image to file
    imagejpeg($vDstImg, $sResultFileName, $iJpgQuality);
    @unlink($sTempFileName);

    return $sResultFileName;
    }
    }
    }
    }
    }
    }

    $sImage = uploadImageFile();
    echo '';

    这样,带剪切功能的上传图片就已经完成了,若有疑问,请留言。大家共勉。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:使用 HTML5 IndexedDB API 下一篇:HTML5之window.postMessage API
    PHP编程就业班

    相关文章推荐

    • html5离线存储有哪些• 深入解析asp.net中mvc4自定义404页面(分享)• h5新增标签audio与video的使用• 你值得了解的HTTP缓存机制(代码详解)• 避免常见的六种HTML5错误用法 (5-6)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网