js生成缩略图后上传并利用canvas重绘

yizhihongxing

JS生成缩略图并上传,可以分成以下几步进行:

  1. 选择图片:通过input[type=file]标签或者拖拽上传等方式进行选择图片。
  2. 根据图片宽高比例计算生成缩略图的宽高:设定缩略图的最大宽高和图片的原始宽高,通过比例计算出缩略图应该生成的宽高,以确保缩略图不会变形。
  3. 利用canvas生成缩略图:将原始图片绘制在canvas中,设置canvas的宽高为缩略图宽高,使用context.drawImage函数将图片绘制在canvas上,然后将生成的图片保存为Blob对象。
  4. 将Blob对象上传到服务器:使用XMLHttpRequest或者Fetch API进行上传,将Blob对象作为文件上传到服务器。
  5. 展示缩略图:将生成的缩略图展示在页面上。

下面是两个示例:

示例1: 利用canvas生成缩略图的代码

// 根据宽高比例计算生成缩略图的宽高
function getThumbnailSize(imgWidth, imgHeight, thumbMaxWidth, thumbMaxHeight) {
  var widthRatio = thumbMaxWidth / imgWidth
  var heightRatio = thumbMaxHeight / imgHeight
  var ratio = Math.min(widthRatio, heightRatio)
  return {
    width: imgWidth * ratio,
    height: imgHeight * ratio
  }
}

// 生成缩略图并上传
function generateThumbnailAndUpload(file) {
  var img = new Image()
  var canvas = document.createElement('canvas')
  var ctx = canvas.getContext('2d')
  var thumbMaxWidth = 300
  var thumbMaxHeight = 300
  img.onload = function() {
    var size = getThumbnailSize(img.width, img.height, thumbMaxWidth, thumbMaxHeight)
    canvas.width = size.width
    canvas.height = size.height
    ctx.drawImage(img, 0, 0, size.width, size.height)
    canvas.toBlob(function(blob) {
      // 将Blob对象上传到服务器
      var xhr = new XMLHttpRequest()
      xhr.open('POST', '/upload')
      xhr.send(blob)
    }, file.type) // 指定生成的图片类型和压缩质量等参数
  }
  img.src = URL.createObjectURL(file)
}

示例2: 获取生成的缩略图数据并展示

// 获取生成的缩略图数据
function getThumbnailData(file) {
  return new Promise(function(resolve, reject) {
    var img = new Image()
    var canvas = document.createElement('canvas')
    var ctx = canvas.getContext('2d')
    var thumbMaxWidth = 300
    var thumbMaxHeight = 300
    img.onload = function() {
      var size = getThumbnailSize(img.width, img.height, thumbMaxWidth, thumbMaxHeight)
      canvas.width = size.width
      canvas.height = size.height
      ctx.drawImage(img, 0, 0, size.width, size.height)
      resolve(canvas.toDataURL(file.type)) // 返回生成的缩略图数据URL
    }
    img.src = URL.createObjectURL(file)
  })
}

// 获取选择的文件并展示
var fileInput = document.querySelector('input[type=file]')
var thumbnailImg = document.querySelector('.thumbnail-img')
fileInput.addEventListener('change', function(event) {
  var file = event.target.files[0]
  getThumbnailData(file).then(function(dataUrl) {
    thumbnailImg.src = dataUrl
    thumbnailImg.style.display = 'block'
  })
})

以上代码中,示例1中的getThumbnailSize函数用来计算生成的缩略图宽高,generateThumbnailAndUpload函数用来生成缩略图并上传,示例2中的getThumbnailData函数用来获取生成的缩略图数据,并展示在页面上。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js生成缩略图后上传并利用canvas重绘 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JS闭包原理及其使用场景解析

    JS闭包原理及其使用场景解析 什么是闭包? 闭包(Closure)指的是有权访问另外一个函数作用域内变量的函数。 用更通俗易懂的话来说,闭包就是函数内部定义的函数,它可以访问自己的变量,还可以访问父级函数的变量。 闭包的原理 在JavaScript中,如果两个函数嵌套的话,内部函数就可以访问外部函数的变量。这是因为在JavaScript中函数会形成一个作用域…

    JavaScript 2023年6月10日
    00
  • javascript入门·动态的时钟,显示完整的一些方法,新年倒计时

    Javascript入门-动态的时钟 基本思路 实现动态时钟,需要获取当前的时间,根据时分秒分别计算对应的角度,并使用transform指令对时钟的指针进行旋转。 HTML文件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <…

    JavaScript 2023年5月27日
    00
  • 利用javaScript处理常用事件详解

    让我来为你详细讲解如何利用JavaScript处理常用事件的攻略。 1. 理解JavaScript事件机制 在使用JavaScript处理事件之前,我们需要先了解JavaScript事件机制。JavaScript事件机制是指通过用户交互或者代码触发某个事件,然后执行对应的事件处理程序的过程。常见的事件包括鼠标事件、键盘事件、表单事件、窗口事件等等。 2. 事…

    JavaScript 2023年5月17日
    00
  • JavaScript基础知识点归纳(推荐)

    JavaScript(简称 JS)是一种具有轻量级、跨平台的特性的编程语言,主要用于通过浏览器与网页进行交互、控制 HTML 和 CSS。下面是 JavaScript 基础知识点的完整攻略。 变量 变量是程序存储数据的容器,在 JavaScript 中,可以使用 var 关键字声明变量。同时,JavaScript 也支持以下数据类型: 数字:例如 123、1…

    JavaScript 2023年5月17日
    00
  • JS中的回调函数实例浅析

    JS中的回调函数实例浅析 什么是回调函数 回调函数是一种在函数执行完毕后,将另一个函数作为参数传递给它,并在后者执行的函数。它的特点是:回调函数是作为参数传递给另一个函数的,当另一个函数执行完毕后,回调函数才会被执行。 回调函数通常用于异步编程中,由于JavaScript是单线程的,异步调用的函数执行完毕后需要得到回调函数的执行结果,以便继续执行后续的代码。…

    JavaScript 2023年5月28日
    00
  • requestAnimationFrame定时动画屏幕刷新率节流示例浅析

    下面我详细讲解一下“requestAnimationFrame定时动画屏幕刷新率节流示例浅析”的攻略。 简介 window.requestAnimationFrame() 是一个 JavaScript 函数,可用于通过浏览器的渲染引擎,来以最佳频率更新显示屏幕上的动画。 在某些情况下,使用 requestAnimationFrame() 可以连续重复执行某个…

    JavaScript 2023年6月11日
    00
  • JS判断数组四种实现方法详解

    JS判断数组四种实现方法详解 在JavaScript中,判断一个变量是否是数组是一项非常常见的操作。本文将介绍四种常用的方法来判断一个变量是否是数组。 方法一:Array.isArray() Array.isArray()是ES5中新增的方法,可以直接判断一个变量是否是数组。 Array.isArray([]); // true Array.isArray(…

    JavaScript 2023年5月27日
    00
  • cesium-2-entity

    1、四层结构 viewer –> datasources(DataSourceCollection类型) –> datasource –> entities(EntityCollection类型) –> entity 需要学习的方向是:只需要注意每个层与层之间的关系和entity实例如何创建即可 2、DataSourceCol…

    JavaScript 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部