Javascript 图像平移/缩放

标签 javascript jquery image jquery-ui zooming

通过结合一些 CSS 和 Jquery UI/可拖动,我创建了平移图像的功能,并且通过一些额外的 JS,您现在可以缩放图像。

我遇到的问题是,如果您放大图像,左上角是固定的,正如您所期望的那样。我想要的是图像保持居中(基于当前的平移),以便图像的中间保持在容器的中间,同时变大。

我已经为此编写了一些代码但没有用,我想我的数学是错误的。谁能帮忙?

我希望它像 this 一样工作做。当您滚动到图像时,它会根据当前平移使图像居中,而不是从 Angular 落缩小。

HTML:

<div id="creator_container" style="position: relative; width: 300px; height: 400px; overflow: hidden;">
    <img src="/images/test.gif" class="user_image" width="300" style="cursor: move; position: absolute; left: 0; top: 0;">
</div>

Javascript:

$("#_popup_creator .user_image").bind('mousewheel', function(event, delta) {
    zoomPercentage += delta;
    $(this).css('width',zoomPercentage+'%');
    $(this).css('height',zoomPercentage+'%');

    var widthOffset = (($(this).width() - $(this).parent().width()) / 2);
    $(this).css('left', $(this).position().left - widthOffset);
});

最佳答案

长话短说,您需要制作一个变换矩阵以按与图像相同的比例缩放,然后使用该矩阵变换图像的位置。如果该解释对您来说完全是希腊语,请查找“图像变换”和“矩阵数学”。

这个页面的开头是一个很好的入门资源,尽管它是一种不同的编程语言: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html


无论如何,我已经在自己的一些项目中实现了这些方法。这是我写的东西的放大功能,可以按照您想要的方式运行:

function zoomIn(event) {
    var prevS = scale;
    scale += .1;
    $(map).css({width: (baseSizeHor * scale) + "px", height: (baseSizeVer * scale) + "px"});

    //scale from middle of screen
    var point = new Vector.create([posX - $(viewer).width() / 2, posY - $(viewer).height() / 2, 1]);
    var mat = Matrix.I(3);
    mat = scaleMatrix(mat, scale / prevS, scale / prevS);
    point = transformPoint(mat, point);

    //http://stackoverflow.com/questions/1248081/get-the-browser-viewport-dimensions-with-javascript
    posX = point.e(1) + $(viewer).width() / 2;
    posY = point.e(2) + $(viewer).height() / 2;
    $(map).css({left: posX, top: posY});

    return false;//prevent drag image out of browser
}

注意命令“new Vector.create()”和“Matrix.I(3)”。这些来自 JavaScript 向量/矩阵数学库 http://sylvester.jcoglan.com/

然后记下“transformPoint()”。这是我使用 sylvester.js 实现的那个 ActionScript 链接(加上关于 http://wxs.ca/js3d/ 的提示)的功能之一

对于我写的全套函数:

function translateMatrix(mat, dx, dy) {
    var m = Matrix.create([
        [1,0,dx],
        [0,1,dy],
        [0,0,1]
    ]);
    return m.multiply(mat);
}
function rotateMatrix(mat, rad) {
    var c = Math.cos(rad);
    var s = Math.sin(rad);
    var m = Matrix.create([
        [c,-s,0],
        [s,c,0],
        [0,0,1]
    ]);
    return m.multiply(mat);
}
function scaleMatrix(mat, sx, sy) {
    var m = Matrix.create([
        [sx,0,0],
        [0,sy,0],
        [0,0,1]
    ]);
    return m.multiply(mat);
}
function transformPoint(mat, vec) {
    return mat.multiply(vec);
}

关于Javascript 图像平移/缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269805/

相关文章:

php - 将文本/javascript 加载到 PHP 页面中

php - 如何在不暴露源文件位置的情况下播放mp3文件?

javascript - If 条件推送包含/匹配字符串的值

jquery - 如何获取页面上某个元素的宽度和高度?

html - CSS调整图像大小并保持原始比例

linux - 将多页 PDF 转换为单个图像

javascript - 提交动态生成的表单

javascript - 使用 Function.prototype.bind 创建的函数对象

javascript - 简单的移动 jQuery 切换按钮和 .toggle 最新 jQuery 的替代品

javascript - sIFR 可以与 Smarty 模板一起使用吗?