Как обрезать изображение в бета-версии Fabri cjs версии 4 - PullRequest
6 голосов
/ 13 марта 2020

Я обновил fabri cjs для новой функции управления.

Но мое старое обрезание изображения больше не работает, поскольку clipTo в fabric.Object удалено в новой версии.

Как я могу обрезать изображение, не используя clipTo, в журнале изменений они сказали, что я должен использовать clipPath.

img.set({
        clipTo: function (ctx) {
           ctx.moveTo(0, 0);
           ctx.arc(0, 0,300, -Math.PI/6, -Math.PI+Math.PI/6 , true);
        }
    });

Вот jsfiddle

Также это официальное демо не будет работать в бета-версии 4 http://fabricjs.com/clipping

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Таким образом, clipTo устарела с версии 2 и была удалена в версии 4. Правильный способ отсечения - использовать свойство clipPath. Вот простой пример:

var radius = 150;
var clipPath = new fabric.Circle({
    left: 0,
    top: 0,
    radius: radius,
    startAngle: 0,
    angle: Math.PI * 2,
    originX: "top"
});

fabric.Image.fromURL("../public/pug_small.jpg", function(img) {
    img.scale(0.5).set({
        left: 100,
        top: 100,
        angle: -15,
        clipPath: clipPath
    });

    canvas.add(img).setActiveObject(img);
});

Официальное руководство для clipPath http://fabricjs.com/clippath-part1

Недавнее обсуждение clipPath в бета-версии 4: https://github.com/fabricjs/fabric.js/issues/6159

И пример демонстрации SandBox: https://codesandbox.io/s/stackoverflow-60664120-fabric-js-400-beta8-mi0y7

0 голосов
/ 13 марта 2020

Я нашел временное решение, но это не совсем ответ:

Я рисую круг и многоугольник

var radius = 100;
var start = -150*Math.PI/180
var end = -30*Math.PI/180
let point1 = new fabric.Point(
  (radius+1)*Math.cos(start),
  (radius+1)*Math.sin(start)
)
let point2 = new fabric.Point(
  (radius+1)*Math.cos(end),
  (radius+1)*Math.sin(end)
)
fabric.Image.fromURL('http://fabricjs.com/assets/pug_small.jpg', function (img) {
    img.scale(1).set({
        left: 0,
        top: 0,
        clipPath:new fabric.Group([
        new fabric.Circle({
          originX:'center',
          originY:'center',
          radius,
          startAngle: start,
          endAngle: end,
          stroke:false,
          strokeWidth:6
        }),
        new fabric.Polygon([point1,{x:0,y:0},point2],{
          originX:'center',
          originY:'center',
          strokeWidth:6
        })
        ])
    );
    canvas.add(img).setActiveObject(img);
});

http://jsfiddle.net/mudin/z75nvgqs/31/

Помощь мне найти лучшее решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...