当前位置: 代码网 > it编程>编程语言>Javascript > 使用JavaScript平移和缩放图像的示例代码

使用JavaScript平移和缩放图像的示例代码

2024年09月08日 Javascript 我要评论
前言平移和缩放是查看图像时常用的功能。我们可以放大图像以查看更多细节,进行图像编辑。dynamsoft document viewer是一个用于此目的的sdk,它为文档图像提供了一组查看器。在本文中,

前言

平移和缩放是查看图像时常用的功能。我们可以放大图像以查看更多细节,进行图像编辑。

dynamsoft document viewer是一个用于此目的的sdk,它为文档图像提供了一组查看器。在本文中,我们将演示如何使用它来平移和缩放图像。此外,我们还将探讨如何使用javascript从头实现这一功能。

使用dynamsoft document viewer平移和缩放图像

创建一个包含以下模板的新html文件。

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <title>edit viewer</title>
  <style>
  </style>
</head>
<body>
</body>
<script>
</script>
</html>

在页面中包含dynamsoft document viewer的文件。

<script src="https://cdn.jsdelivr.net/npm/dynamsoft-document-viewer@1.1.0/dist/ddv.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dynamsoft-document-viewer@1.1.0/dist/ddv.css" rel="external nofollow" >

使用许可证初始化dynamsoft document viewer。可以在这里申请一个证书。

dynamsoft.ddv.core.license = "dls2eyjoyw5kc2hha2vdb2rlijoimjawmdaxlte2ndk4mjk3oti2mzuilcjvcmdhbml6yxrpb25jrci6ijiwmdawmsisinnlc3npb25qyxnzd29yzci6indtcgr6vm05wdjrceq5yuoifq=="; //one-day trial
dynamsoft.ddv.core.engineresourcepath = "https://cdn.jsdelivr.net/npm/dynamsoft-document-viewer@1.1.0/dist/engine";// lead to a folder containing the distributed wasm files
await dynamsoft.ddv.core.init();

创建一个新的文档实例。

const docmanager = dynamsoft.ddv.documentmanager;
const doc = docmanager.createdocument();

创建一个edit viewer实例,将其绑定到一个容器,然后用它来查看我们刚刚创建的文档。

html:

<div id="viewer"></div>

javascript:

const uiconfig = {
  type: dynamsoft.ddv.elements.layout,
  flexdirection: "column",
  classname: "ddv-edit-viewer-mobile",
  children: [
    dynamsoft.ddv.elements.mainview // the view which is used to display the pages
  ],
};
editviewer = new dynamsoft.ddv.editviewer({
  uiconfig: uiconfig,
  container: document.getelementbyid("viewer")
});

editviewer.opendocument(doc.uid);

css:

#viewer {
  width: 320px;
  height: 480px;
}

使用input选择图像文件并将其加载到文档实例中,然后可以用edit viewer进行查看。

html:

<label>
  select an image:
  <br/>
  <input type="file" id="files" name="files" onchange="filesselected()"/>
</label>

javascript:

async function filesselected(){
  let filesinput = document.getelementbyid("files");
  let files = filesinput.files;
  if (files.length>0) {
    const file = files[0];
    const blob = await readfileasblob(file);
    await doc.loadsource(blob); // load image
  }
}

function readfileasblob(file){
  return new promise((resolve, reject) => {
    const filereader = new filereader();
    filereader.onload = async function(e){
      const response = await fetch(e.target.result);
      const blob = await response.blob();
      resolve(blob);
    };
    filereader.onerror = function () {
      reject('oops, something went wrong.');
    };
    filereader.readasdataurl(file);
  })
}

然后,我们可以按住控制键,使用鼠标滚轮放大、缩小和平移图像。在移动设备上,我们可以通过双指实现缩放。

从头开始实现平移和缩放

有几种方法可以实现平移和缩放。

  • 使用绝对像素值。它易于理解,可以有滚动条。
  • 使用css transform。它可以使用gpu来获得更好的性能,但不能保留滚动条。
  • 使用canvas。它具有较高的性能和定制性。dynamsoft document viewer使用此方法。

下面,我们将使用第一种方式进行演示。

  • 创建一个容器作为查看器。包含一张图像。

<div id="viewer">
  <img id="image"/>
</div>

样式:

使用flex布局来对齐组件。

查看器的css:

#viewer {
  width: 320px;
  height: 480px;
  padding: 10px;
  border: 1px solid black;
  overflow: auto;
  display: flex;
  align-items: center;
}

加载所选图像文件。使图像的宽度适合查看器。

let currentpercent;
async function filesselected(){
  let filesinput = document.getelementbyid("files");
  let files = filesinput.files;
  if (files.length>0) {
    const file = files[0];
    const blob = await readfileasblob(file);
    const url = url.createobjecturl(blob);
    loadimage(url);
  }
}

function loadimage(url){
  let img = document.getelementbyid("image");
  img.src = url;
  img.onload = function(){
    let viewer = document.getelementbyid("viewer");
    let percent = 1.0;
    resizeimage(percent);
  }
}

function resizeimage(percent){
  currentpercent = percent;
  let img = document.getelementbyid("image");
  let viewer = document.getelementbyid("viewer");
  let borderwidth = 1;
  let padding = 10;
  let ratio = img.naturalwidth/img.naturalheight;
  let newwidth = (viewer.offsetwidth - borderwidth*2 - padding*2) * percent
  img.style.width = newwidth + "px";
  img.style.height = newwidth/ratio + "px";
}

function readfileasblob(file){
  return new promise((resolve, reject) => {
    const filereader = new filereader();
    filereader.onload = async function(e){
      const response = await fetch(e.target.result);
      const blob = await response.blob();
      resolve(blob);
    };
    filereader.onerror = function () {
      reject('oops, something went wrong.');
    };
    filereader.readasdataurl(file);
  })
}

添加一个wheel事件,以便在按下控制键的情况下使用鼠标进行缩放。

img.addeventlistener("wheel",function(e){
  if (e.ctrlkey || e.metakey) {
    if (e.deltay < 0) {
      zoom(true);
    }else{
      zoom(false);
    }
    e.preventdefault();
  }
});

function zoom(zoomin,percentoffset){
  let offset = percentoffset ?? 0.1;
  if (zoomin) {
    currentpercent = currentpercent + offset;
  }else{
    currentpercent = currentpercent - offset;
  }
  currentpercent = math.max(0.1,currentpercent);
  resizeimage(currentpercent);
}

添加pointer事件以使用鼠标或触摸屏实现平移。

let downpoint;
let downscrollposition;
img.addeventlistener("pointerdown",function(e){
  previousdistance = undefined;
  downpoint = {x:e.clientx,y:e.clienty};
  downscrollposition = {x:viewer.scrollleft,y:viewer.scrolltop}
});
img.addeventlistener("pointerup",function(e){
  downpoint = undefined;
});
img.addeventlistener("pointermove",function(e){
  if (downpoint) {
    let offsetx = e.clientx - downpoint.x;
    let offsety = e.clienty - downpoint.y;
    let newscrollleft = downscrollposition.x - offsetx;
    let newscrolltop = downscrollposition.y - offsety;
    viewer.scrollleft = newscrollleft;
    viewer.scrolltop = newscrolltop;
  }
});

添加touchmove事件以支持缩放。计算两个触摸点的距离,以知道需要放大还是缩小。

img.addeventlistener("touchmove",function(e){
  if (e.touches.length === 2) {
    const distance = getdistancebetweentwotouches(e.touches[0],e.touches[1]);
    if (previousdistance) {
      if ((distance - previousdistance)>0) { //zoom
        zoom(true,0.02);
      }else{
        zoom(false,0.02);
      }
      previousdistance = distance;
    }else{
      previousdistance = distance;
    }
  }
  e.preventdefault();
});

function getdistancebetweentwotouches(touch1,touch2){
  const offsetx = touch1.clientx - touch2.clientx;
  const offsety = touch1.clienty - touch2.clienty;
  const distance = offsetx * offsetx + offsety + offsety;
  return distance;
}

好了,我们已经用javascript实现了平移和缩放功能。

以上就是使用javascript平移和缩放图像的示例代码的详细内容,更多关于javascript平移和缩放图像的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com