在D3中调整大小时,使用矩形边界裁剪SVG图像

ps0604

在此jsFiddle中,D3结合使用interact.js,两者都在进行SVG有一个包含矩形和图像的组。组类是可调整大小的,可以正常工作。问题在于,矩形在调整大小后应裁剪图像(即,图像永远不应超出矩形边界),但事实并非如此。clipPath为此使用了D3 ,但是它不起作用。问题是什么?

var svg = d3.select("body")
            .append("svg")
            .attr("width", 500)
            .attr("height", 200);

var g = svg.append('g')
           .attr('class', 'resize-me');

var rect = g.append('rect')
    .attr('stroke', 'blue')
    .attr('x', 0)
    .attr('y', 0)
    .attr("width", 200)
    .attr("height", 200)
    .attr('stroke-width', 2)
    .attr('stroke', 'white')
    .attr('fill', 'grey');

var image = g.append('image')
      .attr('x', 0)
      .attr('y', 0)
      .attr('width', 128)
      .attr('height', 128)
      .attr("xlink:href", imageUrl);


interact('.resize-me')
    .resizable({
        edges: { left: true, right: true, bottom: true, top: true }
    })
    .on('resizemove', function(event) {

        var target = event.target;
        var rect = target.childNodes[0];
        var img = target.childNodes[1];

        var x = (parseFloat(target.getAttribute('endx')) || 0)
        var y = (parseFloat(target.getAttribute('endy')) || 0)

        rect.setAttribute('width', event.rect.width);
        rect.setAttribute('height', event.rect.height);

        x += event.deltaRect.left
        y += event.deltaRect.top
        rect.setAttribute('transform', 'translate(' + x + ', ' + y + ')')

        rect.setAttribute('endx', x)
        rect.setAttribute('endy', y)


        // clip image

        svg.append('defs')
           .append('clipPath')
           .attr('id', 'clip2')
           .append('rect')
           .attr('x', 0)
           .attr('y', 0)
           .attr('width', event.rect.width)
           .attr('height', event.rect.height);

        image.attr("clip-path", "url(#clip2)");

    });
亚历克斯·L

您是否希望图像始终扩大以填充灰色框?https://jsfiddle.net/alexander_L/u607w315/12/(用于图像扩展的12版)

在此处输入图片说明

另外,<def/>每次事件触发时,您都将附加标签:

在此处输入图片说明

它很快就失控了。

您应该将<def/>d附加到一些虚拟的单元素数组数据上,并使用d3.js更新模式,或更简单的方法是,您只需<def/>在源代码中创建标签并每次更新同一标签的属性即可。

您可以一开始就做一次:

var def = svg.append('defs')
           .append('clipPath')
           .attr('id', 'clip2')
           .append('rect')
           .attr('x', 0)
           .attr('y', 0)
           .attr('width', 200)
           .attr('height', 200);

然后使用此变量并在活动期间进行更新:

def.attr('x', 0)
           .attr('y', 0)
           .attr('width', event.rect.width)
           .attr('height', event.rect.height);

然后,您可以避免此问题。

https://jsfiddle.net/alexander_L/u607w315/11/(用于图像裁剪的版本11)

您是否想要这种行为:

在此处输入图片说明

当灰色框的一维尺寸小于图像尺寸时,图像被裁剪吗?

更新

由于OP注意到原始代码中的一个错误,该错误导致灰色框始终至少恢复到图像的高度或宽度,因此我尝试也解决了此问题。

但是,我还注意到一些奇怪的行为,即框的左上角无法进一步向上延伸或向左延伸,因此我首先进行了修复:https : //jsfiddle.net/alexander_L/u607w315/25/

请参阅新行为的.gif和OP提到的旧错误:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在D3 JS中调整矩形大小

在d3.js中调整窗口大小时调整SVG大小

使用GeometryReader调整窗口大小时,在SwiftUI中调整矩形网格的大小

调整窗口大小时如何裁剪图像并使其居中

在d3.js中调整图像大小时如何不保留长宽比

使用 graphicsmagick 调整大小和裁剪图像

使用CSS调整图像的裁剪部分的大小

调整大小时,使用laravel中的asset功能加载图像

调整保存 SVG (d3) 的 React 组件的大小

使用D3在Angular组件中显示SVG图像

使用边界框列表从图像中裁剪多个边界框

可调整大小和可旋转的矩形D3?

使用ImageResizer调整图像大小和裁剪图像

图像裁剪和调整大小

裁剪矩形未在响应图中调整大小

调整我的d3图表的大小,以便在页面加载和调整窗口大小时为100%

在调整大小时重新创建 D3 多折线图(响应式)

TYPO3图像调整大小和裁剪

调整窗口大小时裁剪文本

在 Django Admin 和外部使用 django 中的 celery 调整大小/裁剪图像

使用Python OpenCV从图像中裁剪/旋转/调整扑克牌大小

如何在 HTML 和 CSS 中裁剪调整大小的图像?

检测图像中的矩形并裁剪

使用 php 调整大小或裁剪 base64 图像

如何调整大小然后使用画布裁剪图像

如何使用ImageSharp调整中心大小和裁剪图像

如何使用PDFlib精确放置裁剪和调整大小的图像?

调整d3 / dagre-d3 svg的大小以显示所有内容

CSS:调整窗口大小时,图像中的图像会弹出