Fabric JS html 5图像弯曲选项

时间:2014-10-16 11:50:51

标签: javascript jquery html html5-canvas fabricjs

我想用html5工具制作图像曲线。

我正在使用Fabric.js作为html5画布工具。

请指导我如何在图像上制作弯曲图像,如马克杯,玻璃杯,圆柱形或圆形产品。

参考。图片如下:

http://vsdemo.cwwws.com/Images/ProductImages/asdasd.jpg

2 个答案:

答案 0 :(得分:7)

您所希望的内容称为“透视扭曲”,并且在原生2D画布中不可用。

您可以通过使用适当的Y偏移绘制1个像素宽的垂直条带来实现效果。

enter image description here

以下是如何做到这一点的大纲,为您提供一个起点:

  • 创建一个形成所需曲线的y偏移数组:

    // Just an example, you would define much better y-offsets!
    // Hint: Better offsets can be had by fetching y-values from a quadratic curve.
    
    var yOffsets=[0,1,2,3,4,5,6,5,4,3,2,1,0];
    
  • 创建内存中的画布:

    var canvas=document.createElement('canvas')
    var context=canvas.getContext('2d');
    
  • 使用剪裁版context.drawImage以“弯曲”y偏移绘制图像的1像素宽垂直切片:

    for(var x=0;x<offsetY.length;x++){
        context.drawImage(img,
            // clip 1 pixel wide slice from the image
            x,0,1,img.height,
            // draw that slice with a y-offset
            x,offsetY[x],1,img.height
        );           
    }
    
  • 从临时画布创建图像并在FabricJS中创建图像对象:

    var perspectiveImage=new Image();
    perspectiveImage.onload=function(){
        // This is the mug-shaped image you wanted! 
        // Use it in FabricJS as desired.
    }
    perspectiveImage.src=canvas.toDataURL();
    

答案 1 :(得分:0)

抱歉,这并不能算是真正的答案,但我的代表不允许我发表评论。 只是对markE的优秀答案的一个小补充: 圆柱/圆的透视扭曲看起来像一个椭圆,而不是二次函数。计算椭圆的 y 偏移量的一种方法是:

const offsetY = (x, radiusA, radiusB) => {
    return radiusB * Math.sqrt(1 - (x * x) / (radiusA * radiusA));
  };

其中 radiusA 是直径的一半,例如'mug',radiusB 是最大垂直偏移量。 x 必须在“杯子”的水平中点处调整为“0”(零)。