将图像上传到现有的HTML5 Canvas

时间:2013-03-04 02:24:04

标签: html5 canvas kineticjs

我有一个带有设置背景图片的画布。然后,您可以在画布顶部添加文本,它是可拖动的。我希望用户能够上传可拖动(最终可调整大小)的图像以添加到画布中。

我现在的代码如下:

var URL = window.webkitURL || window.URL;

window.onload = function() {
    var input = document.getElementById('input');
    input.addEventListener('change', handleFiles, false);
}

function handleFiles(e) {
    var ctx = memestage.getContext('2d');
    var url = URL.createObjectURL(e.target.files[0]);
    var img = new Image();
    img.onload = function() {
        img.add(bg);
        ctx.drawImage(img, 5, 5);    
    }
    img.src = url;

}

任何建议都将不胜感激。可根据要求提供更多信息。谢谢!

1 个答案:

答案 0 :(得分:0)

这是KineticJS代码,用于在您的身份证上绘制学生的姓名和照片。

学生可以在卡片上拖动他们的名字和照片。

照片无法调整大小,但我已将照片缩放到适合您卡片的照片区域。如果更改卡片布局,则可以在KineticJS图像对象中轻松调整宽度/高度。

这是代码和小提琴:http://jsfiddle.net/m1erickson/9jTtb/

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Prototype</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script src="http://www.html5canvastutorials.com/libraries/kinetic-v4.3.0-beta2.js"></script>
<style>
#container{
  border:solid 1px #ccc;
  margin-top: 10px;
}
</style>        
<script>
$(function(){

    var stage = new Kinetic.Stage({
        container: 'container',
        width: 472,
        height: 286
    });

    var layer=new Kinetic.Layer();
    stage.add(layer);

    var preload=[];
    var images=[];
    preload.push("http://dl.dropbox.com/u/139992952/idcard.png");
    // I use a demo photo here
    // Of course in your live site, you would use URL.createObjectURL
    preload.push("http://macmcrae.com/wp-content/uploads/2009/07/bubblebobble.jpg");
    preloadImages(preload,init);

    function init(images){
        KImage("background",0,0,472,286,false,layer,images[0]);
        KImage("Photo",284,105,160,160,true,layer,images[1]);
        KText("Name",50,190,"Verdana",27,"black",true,layer,"Sam Student");
    }

    // image preloader
    function preloadImages(sources,callback){
        var images=[];
        var count=0;
        for(var i=0;i<preload.length;i++){
            images[i]=new Image();
            images[i].onload=function(){
                if(++count==preload.length){
                    callback(images);
                }
            }
            images[i].src=preload[i];
        }
    }

    // build the specified KineticJS Image and add it to the stage
    function KImage(id,x,y,width,height,isDraggable,layer,img){
        var kImg=new Kinetic.Image({
            image:img,
            id:id,
            x:x,
            y:y,
            width:width,
            height:height,
            draggable:isDraggable
        });
        layer.add(kImg);
        stage.draw();
    }

    // build the specified KineticJS Text and add it to the stage
    function KText(id,x,y,font,fontsize,color,isDraggable,layer,text){
        var kText=new Kinetic.Text({
            text:text,
            id:id,
            x:x,
            y:y,
            fontFamily:font,
            fontSize:fontsize,
            fill:color,
            draggable:isDraggable
        });
        layer.add(kText);
        stage.draw();
    };

}); // end $(function(){});

</script>       
</head>

<body>
    <div id="container"></div>
    <img id="test"/>
</body>
</html>

[已编辑回答OP的其他要求]

我查看了你的代码,但找不到任何php上传脚本,所以这是一般的想法。

我假设您已经在php.ini中设置了配置,尤其是:

  • file_uploads = true;
  • 的upload_max_filesize = 2M; //或者您希望用户上传的最大尺寸
  • 的post_max_size = 8M;

我假设您已经创建了一个文件夹来保存您上传的文件并获得Web服务器所有权(或足够的权限)。下面的代码假定子目录是“uploads”。

然后,下面的PHP代码将上传用户的图像,并使用与用户原始文件相同的名称将其存储在“uploads”目录中。

您仍然必须修改此代码以进行您认为必要的任何边界/错误检查。就个人而言,我会尽量做到这些:

  • $ _ FILES不为空且为数组
  • $ _ FILES报告未发生错误
  • 文件名仅包含这些英文字符[0-9] [A-Z] [。]
  • 文件名不超过250个字符
  • 文件不为空
  • 文件不大于upload_max_size
  • 文件具有以下扩展名之一:.jpg,.jpeg,.gif,.png //或您接受的任何内容
  • 文件尚不存在//添加逻辑以覆盖或拯救
  • 关于上述测试失败的捕获程序

php部分看起来像这样:

<?php

var $uploadDirectory="uploads/";  // or whatever dir you set up
var $maxFileSize=1000000;         // or whatever max-size you allowed

// assuming 'file' is the name of your input-type-file tag

// oops, got an error
if ($_FILES["file"]["error"] > 0){echo "Error occured: " . $_FILES["file"]["error"] . "<br>"; }

// get filepaths
var $tempfile=$_FILES["file"]["tmp_name"];
var $basefile=basename($_FILES['file']['name']);

// save the user's file
move_uploaded_file( $tempfile, $uploadDirectory . $basefile );

// do whatever other postback stuff you need to do

?>

HTML表单将是这样的:

<form action="upload.php" enctype="multipart/form-data" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
    <input type="file" name="file"/>
    <input type="submit" name="submit" value="upload" />
</form>