对于制作 Photo Collage Maker,我使用具有基于对象的裁剪功能的面料js.该功能非常好,但是裁剪区域内的图像无法缩放,移动或旋转.我想要固定位置裁剪区域,图像可以根据用户想要定位在固定裁剪区域内.

我google了,找到非常接近的解决方案

var canvas = new fabric.Canvas('c');
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.rect(10,10,150,150);
ctx.rect(180,200,200);
ctx.closePath();
ctx.stroke();
ctx.clip();

Multiple Clipping Areas on fabric js canvas

其中一个裁剪区域的图像出现在另一裁剪区域中.如何避免这种情况,或者有另一种使用fabric js来完成这种方式的方法.

解决方法

这可以通过使用clipTo属性的Fabric来实现,但是必须在clipTo函数中反转转换(缩放和旋转).

当您在Fabric中使用clipTo属性时,缩放和旋转将在剪辑后应用,这意味着剪切与图像进行缩放和旋转.您必须通过在clipTo属性函数中应用转换的准确相反来对抗.

我的解决方案涉及到一个Fabric.Rect作为剪辑区域的“占位符”(这具有优点,因为您可以使用Fabric来移动对象,从而将剪辑区域移动.

请注意,我的解决方案使用Lo-Dash实用程序库,特别是_.bind()(参见上下文的代码).

Example Fiddle

分解

1.初始化面料

首先我们想要我们的画布,当然是:

var canvas = new fabric.Canvas('c');

2.剪辑区域

var clipRect1 = new fabric.Rect({
    originX: 'left',originY: 'top',left: 180,top: 10,width: 200,height: 200,fill: 'none',stroke: 'black',strokeWidth: 2,selectable: false
});

我们给这些Rect对象一个名称属性clipFor,所以clipTo函数可以找到他们想要剪切的对象:

clipRect1.set({
    clipFor: 'pug'
});
canvas.add(clipRect1);

不必是剪辑区域的实际对象,但它可以更轻松地进行管理,因为您可以使用Fabric移动它.

剪切功能

我们定义要由图像的clipTo属性单独使用的功能,以避免代码重复:

由于Image对象的angle属性以度为单位存储,我们将使用此属性将其转换为弧度.

function degToRad(degrees) {
    return degrees * (Math.PI / 180);
}

findByClipName()是一个方便的函数,它正在使用Lo-Dash,找到要剪切的Image对象的clipFor属性(例如,在下面的图片中,name将为“pug”):

function findByClipName(name) {
    return _(canvas.getobjects()).where({
            clipFor: name
        }).first()
}

这是工作的一部分:

var clipByName = function (ctx) {
    var clipRect = findByClipName(this.clipName);
    var scaleXTo1 = (1 / this.scaleX);
    var scaleYTo1 = (1 / this.scaleY);
    ctx.save();
    ctx.translate(0,0);
    ctx.rotate(degToRad(this.angle * -1));
    ctx.scale(scaleXTo1,scaleYTo1);
    ctx.beginPath();
    ctx.rect(
        clipRect.left - this.left,clipRect.top - this.top,clipRect.width,clipRect.height
    );
    ctx.closePath();
    ctx.restore();
}

注意:在上面的功能中,请参见下面的使用说明.

4. fabric.Image对象使用clipByName()

最后,可以实例化图像,并使用clipByName函数,如下所示:

var pugImg = new Image();
pugImg.onload = function (img) {    
    var pug = new fabric.Image(pugImg,{
        angle: 45,width: 500,height: 500,left: 230,top: 170,scaleX: 0.3,scaleY: 0.3,clipName: 'pug',clipTo: function(ctx) { 
            return _.bind(clipByName,pug)(ctx) 
        }
    });
    canvas.add(pug);
};
pugImg.src = 'http://fabricjs.com/lib/pug.jpg';

_.bind()做什么?

请注意,引用包装在_.bind()函数中.

我使用_.bind()有两个原因:

>我们需要将参考图像对象传递给clipByName()
> clipTo属性传递画布上下文,而不是对象.

基本上,_.bind()允许您创建一个使用您指定的对象作为此上下文的函数的版本.

来源

> http://lodash.com/docs#bind
> http://fabricjs.com/docs/fabric.Object.html#clipTo
> http://html5.litten.com/understanding-save-and-restore-for-the-canvas-context/

html5-canvas – Fabric.js画布上的多个裁剪区域的更多相关文章

  1. 详解Canvas实用库Fabric.js使用手册

    这篇文章主要介绍了详解Canvas实用库Fabric.js使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  3. ios – 通过Fabric安装的Twitter,登录工作,请求推文的持久性错误

    我没有想法.解决方法当你请求推文时,我想你的代码如下所示,对吗?原来他们的文档不完整,应该是这样的客户端对象需要您的用户信息来完成它的工作.我遇到过同样的问题.

  4. ios – Xcode 6:在Fabric Crashlytics更新后找不到’Answers.h’文件

    我在Objective-C项目的Xcode6.3.2中的故事板中工作.我尝试构建时突然间出现错误:/…来看看我的变化,它只显示我所做的更改–这与Crashlytics无关.还有其他人看到这个吗?有人建议以最有效的方式恢复并重新开始工作吗?

  5. fabric-twitter – Twitter Fabric xcode – 上传分发时出错:归档分发错误:-3

    爱德华.解决方法当我更改目标的包标识符并尝试将其作为与以前相同的应用程序分发时,我收到此错误.我通过将我的应用程序注册为Fabric中的新应用程序解决了这个问题.

  6. ios – Fabric Crashlytics中缺少dSYM文件

    参见英文答案>Crashlytics:“We’remissingadSYMtoprocesscrashes”6从昨天起,我尝试在iOS应用程式中配置TwitterCrashlytics.我有一个问题wdSYMs文件.面料仪表板显示我的消息“我们缺少dSYMs文件”,所以我通过在线管理员上传文件(从此消息重定向),并显示此消息:但是如果我回到仪表板,系统丢失dSYMS文件的消息再次显示.我要做什么?

  7. ios – “Fabric.framework / run”构建阶段实际上做了什么?

    我使用Crashlytics框架在iOSApps中进行崩溃收集.使用框架时,会在运行/Fabric/Fabric.framework/run的目标中添加“构建阶段”.

  8. ios – 突然出现很多Fabric Out of Memory会话:Fabric OOM报告是否会出现误报?

    解决方法是的,在某些情况下,由于当前的OOM启发式而错误地检测到OOM.后台获取可能会错误地报告OOM.

  9. Swift正式选用超级账本Fabric技术,节约30%跨境支付成本

    全球安全金融信息服务提供商Swift已经正式选择在自己最突出的区块链项目中使用超级账本Fabric数据库。如果这个区块链概念验证获得成功,Swift全球支付创新倡议主管WimRaymaekers表示这可以节约高达30%与跨境支付相关的核账成本。值得注意的是,这次试验还将尝试利用Swift成员使用的现有标准。Swift的Fabric概念验证正在创建利用该银行信息平台的现有GPI资源。不过,Swift今年已经开放了自己的态度,愿意尝试将区块链技术与自己的业务模式进行可能的整合。

  10. 如何使用Fabric SDK强制Swift iOS应用程序崩溃?

    ,它说:我认为在Swift中会是这样但这似乎并不存在.(也许文档已经过时,不再适用,因为Fabric吞噬了Crashlytics?)我看到有一个Crashlytics.crash……

随机推荐

  1. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 使用HTML5做的导航条详细步骤

    这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. H5最强接口之canvas实现动态图形功能

    这篇文章主要介绍了H5最强接口之canvas实现动态图形功能,需要的朋友可以参考下

  4. Canvas高级路径操作之拖拽对象的实现

    这篇文章主要介绍了Canvas高级路径操作之拖拽对象的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. html5视频自动横过来自适应页面且点击播放功能的实现

    这篇文章主要介绍了h5视频自动横过来自适应页面且点击播放,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. 详解HTML5中的picture元素响应式处理图片

    这篇文章主要介绍了详解HTML5中的picture元素响应式处理图片,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. canvas像素点操作之视频绿幕抠图

    这篇文章主要介绍了canvas像素点操作之视频绿幕抠图的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  9. canvas绘制视频封面的方法

    这篇文章主要介绍了canvas绘制视频封面的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. HTML5拖拽功能实现的拼图游戏

    本文通过实例代码给大家介绍了HTML5拖拽功能实现的拼图游戏,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

返回
顶部