javascript - canvas裁切图片
天蓬老师
天蓬老师 2017-04-10 17:01:38
[JavaScript讨论组]

我把图片保存到canvas里了,然后用jscrop插件切图,
onSelect里获取了他的坐标和大小,现在我想把他保存到另一个canvas
但是drawImage里的第一个参数是保存的是images对象,我写成canvas对象报错,
要怎么改

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            body{margin: 0;padding: 0;}
            .box{width:100%;overflow:hidden;margin: 0 auto;}
            .piclistbox{width: 50%;float: left;overflow: hidden;border: 1px solid red;box-sizing: border-box;height:600px;}
            .canvasbox{width: 50%;float:right;overflow: hidden;border: 1px solid red;box-sizing: border-box;height:600px;}
        </style>
        <script type="text/javascript" src="jquery-1.11.1.js" ></script>
        <script type="text/javascript" src="jquery.Jcrop.min.js" ></script>
    </head>

    <body>
        <p class="box">
        <p class="piclistbox"></p>
        <p class="canvasbox"></p>
        </p>
        <input type="button" value="裁切" class="btnpoptailor"></input>
    </body>
    <script type="text/javascript">
        
    var ADDPOST = (function(root, window) {
        root.picture = {
            createcanvas:function(picUrl){//创建一个canvas
                var _this = this;
                var getSingle = function(fn){
                    var result;
                    return function(){
                        return result || (result=fn.apply(this,arguments));
                    }
                }
                var createcanvasLayer = function(){
                    var canvas = $("<canvas id='pic_canvas' style='display:none'></canvas>");
                    $(".piclistbox").html(canvas);
                    return canvas;
                }
                
                var canvas_pic = getSingle(createcanvasLayer);
                
                $('.btnpoptailor').on('click',function(){
                    var canvasLayer = canvas_pic();
                    $(canvasLayer).show();
                    _this.simditorimg();
                })
            },
            simditorimg:function(){//把图片放到canvas里
                var canvas = document.getElementById('pic_canvas');
                var img = new Image();
                var _this = this;
                img.src = "http://img1.3lian.com/img013/v1/83/d/1.jpg";
                
                img.onload = function(){
                    
                    var ctx = canvas.getContext("2d");
                    ctx.clearRect(0,0,canvas.width,canvas.height);
                    alert(img.width + ":" + img.height);
                    if(img.height > 400){
                       img.width *= 400 / img.height;
                       img.height = 400;
                    }                
                    if(img.width > 400){
                       img.height *= 400 / img.width;
                       img.width = 400;
                    }
                    canvas.width = img.width;
                    canvas.height = img.height;
                    
                    ctx.drawImage(img, 0, 0, canvas.width, canvas.height); 
                    _this.jscrop();
                }
            },
            jscrop:function(){//裁切
                $('.piclistbox').Jcrop({
                      aspectRatio : 1/1,
                      bgColor: 'rgba(0,0,0,0.5)',
                    onChange: updatePreview,
                    onSelect: updatePreview
                });
                function updatePreview(c){//这里把裁切的保存到另一个canvas里,大神就是这里报错,等待处理???
                    var canvas = document.createElement('canvas');
                    var ss = document.getElementById('pic_canvas');
                    canvas.width = 640;
                    canvas.height = 640;
                    $(".canvasbox").append(canvas);
                    var ctx = canvas.getContext('2d');
                    ctx.drawImage(ss, c.y, c.w, c.h, 0, 0, canvas.width, canvas.height);
                }
            }    
        }
        return root;
    }(ADDPOST || {}, typeof window !== 'undefined' ? window : this));


    $(function() {
        ADDPOST.picture.createcanvas();
    })
    </script>
</html>
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
PHP中文网

刚好用canvas和jcrop写过东西。

canvas到canvas应该使用getImageData()和putImageData()接口,参数查阅一下文档。

你得到相关坐标后,用getImageData得到imageData对象,然后putImageData到另一个canvas上,最后转成DataURL或者ObjectUrl就行了。

怪我咯

一般的切图 直接 用 js的drawImage就可以了满足了~
/////////////上面是先前的回答//////////////
上面大概意思是切图直接切就行了不用第三插件,根本不需要考虑类型转换

然后题主是要解决参数类型的问题的话 可以拿到画板图片的base64编码传入image对象就转过来了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号