react canvas拼接图片(纵向)

react 拼接图片代码

底部有demo

import React from "react";
import "./App.css";

function App() {
  return (
    <>
      <div>
        <input
          type="file"
          id="upFile"
          onChange={upFile.bind(this)}
          accept="image/*"
          multiple="multiple"
        />
        <label htmlFor="upFile">
          <span className="choosefile-btn">选择文件</span>
        </label>
      </div>
    </>
  );
}
const returnType = "base64";
const quality = 0.618;
let returnData = null;
const isAutoDownload = true;
const widths = 1366;

let base64ToBlob = (code) => {
  let parts = code.split(";base64,");
  let contentType = parts[0].split(":")[1];
  let raw = window.atob(parts[1]);
  let rawLength = raw.length;
  let uInt8Array = new Uint8Array(rawLength);

  for (let i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i);
  }
  return new Blob([uInt8Array], { type: contentType });
};
let downloadFile = (fileName, content) => {
  let aLink = document.createElement("a");
  let blob = base64ToBlob(content); // new Blob([content]);
  let evt = document.createEvent("HTMLEvents");
  evt.initEvent("click", true, true); // initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
  aLink.download = fileName;
  aLink.href = URL.createObjectURL(blob);
  aLink.dispatchEvent(
    new MouseEvent("click", {
      bubbles: true,
      cancelable: true,
      view: window,
    })
  ); // 兼容火狐
};

let upFile = (event) => {
  let file = document.getElementById("upFile").files;
  if (returnType !== "file") {
    const files = Array.from(file);
    filesToInstances(files);
  } else {
    returnData = file;
    this.returnRes();
  }
};
let filesToInstances = (files) => {
  const length = files.length;
  let instances = [];
  let finished = 0;
  files.forEach((file, index) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = (e) => {
      const image = new Image();
      image.src = e.target.result;
      image.onload = () => {
        // 图片实例化成功后存起来
        instances[index] = image;
        finished++;
        if (finished === length) {
          drawImages(instances);
        }
      };
    };
  });
};

let drawImages = (images) => {
  const width = widths;
  const heights = images.map((item) => (width / item.width) * item.height);
  const canvas = document.createElement("canvas");
  canvas.width = width;
  canvas.height = heights.reduce((total, current) => total + current);
  const context = canvas.getContext("2d");

  let y = 0;

  images.forEach((item, index) => {
    const height = heights[index];
    context.drawImage(item, 0, y, width, height);
    y += height;
  });
  const base64Url = canvas.toDataURL("image/jpeg", quality);

  dealImages(base64Url);
  if (returnType === "base64" && isAutoDownload) {
    downloadFile(createFileName(), base64Url);
  }
};

let dealImages = (url) => {
  returnData = url;
  console.log(url);
  // 此处返回图片base64
};

let createFileName = () => {
  return "图片拼接" + new Date().getTime();
};

export default App;

App.css

input{
  display: none;
}

.choosefile-btn{
  display: inline-block;
  padding: 10px 20px;
  margin-top: 40px;
  background: rgb(83, 170, 148);
  border-radius: 8px;
  color: #efeefe;
}

vue拼接图片代码:vue拼接图片代码

angular拼接图片代码:angular拼接图片代码

demo地址(vue):demo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值