Vue实现base64编码图片间的切换功能

要实现Vue中base64编码图片间的切换功能,需要以下步骤:

1. 生成base64编码图片

使用FileReader对象和canvas元素可以将普通图片转化成base64编码图片,具体步骤如下:

// 生成base64编码图片
const file = e.target.files[0]
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => {
  const img = new Image()
  img.src = reader.result
  img.onload = () => {
    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')
    canvas.width = img.width
    canvas.height = img.height
    ctx.drawImage(img, 0, 0, img.width, img.height)
    const base64Img = canvas.toDataURL('image/png', 1)
    this.base64Img = base64Img // 存储base64编码图片
  }
}

2. 实现切换功能

可以使用v-ifv-show指令来控制图片的显示与隐藏。具体步骤如下:

<template>
  <div>
    <button @click="showFirstImg">显示第一个图片</button>
    <button @click="showSecondImg">显示第二个图片</button>
    <img v-if="showFirst" :src="firstImg" />
    <img v-if="showSecond" :src="secondImg" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      showFirst: true,
      showSecond: false,
      firstImg: '', // 第一个图片的base64编码字符串
      secondImg: '', // 第二个图片的base64编码字符串
    }
  },
  methods: {
    showFirstImg() {
      this.showFirst = true
      this.showSecond = false
    },
    showSecondImg() {
      this.showFirst = false
      this.showSecond = true
    },
  },
}
</script>

示例一:

<template>
  <div>
    <label for="file">上传图片:</label>
    <input type="file" @change="convertFileToBase64" />
    <button @click="showImage">显示图片</button>
    <img v-if="show" :src="base64Img" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      base64Img: '', // 存储base64编码图片
      show: false,
    }
  },
  methods: {
    convertFileToBase64(e) {
      // 生成base64编码图片
      const file = e.target.files[0]
      const reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = () => {
        const img = new Image()
        img.src = reader.result
        img.onload = () => {
          const canvas = document.createElement('canvas')
          const ctx = canvas.getContext('2d')
          canvas.width = img.width
          canvas.height = img.height
          ctx.drawImage(img, 0, 0, img.width, img.height)
          const base64Img = canvas.toDataURL('image/png', 1)
          this.base64Img = base64Img
        }
      }
    },
    showImage() {
      // 显示base64编码图片
      this.show = true
    },
  },
}
</script>

示例二:

<template>
  <div>
    <label for="file1">上传第一个图片:</label>
    <input type="file" id="file1" @change="convertFileToBase64(1)" />
    <label for="file2">上传第二个图片:</label>
    <input type="file" id="file2" @change="convertFileToBase64(2)" />
    <button @click="showFirstImg">显示第一个图片</button>
    <button @click="showSecondImg">显示第二个图片</button>
    <img v-if="showFirst" :src="firstImg" />
    <img v-if="showSecond" :src="secondImg" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      firstImg: '', // 第一个图片的base64编码字符串
      secondImg: '', // 第二个图片的base64编码字符串
      showFirst: true,
      showSecond: false,
    }
  },
  methods: {
    convertFileToBase64(index) {
      // 生成base64编码图片
      const file = index === 1 ? this.$refs.file1.files[0] : this.$refs.file2.files[0]
      const reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = () => {
        const img = new Image()
        img.src = reader.result
        img.onload = () => {
          const canvas = document.createElement('canvas')
          const ctx = canvas.getContext('2d')
          canvas.width = img.width
          canvas.height = img.height
          ctx.drawImage(img, 0, 0, img.width, img.height)
          const base64Img = canvas.toDataURL('image/png', 1)
          if (index === 1) {
            this.firstImg = base64Img
          } else if (index === 2) {
            this.secondImg = base64Img
          }
        }
      }
    },
    showFirstImg() {
      // 显示第一个图片
      this.showFirst = true
      this.showSecond = false
    },
    showSecondImg() {
      // 显示第二个图片
      this.showFirst = false
      this.showSecond = true
    },
  },
}
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue实现base64编码图片间的切换功能 - Python技术站

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

相关文章

  • Electron-vue脚手架改造vue项目的方法

    Electron-vue脚手架是一个可以快速搭建Electron和Vue.js项目的基础框架。如果你已经有了一个使用Vue.js开发的项目,而且想要将其转换为一个Electron应用程序,那么本篇攻略将会为你提供详细的指导。 步骤一:创建Electron-vue项目 首先,我们需要创建一个新的Electron-vue项目,并将Vue.js项目的代码复制到其中…

    Vue 2023年5月27日
    00
  • vue中更改数组中属性,在页面中不生效的解决方法

    当我们在vue中操作数组时,如果直接更改数组中某个元素的属性值,它并不会立即更新页面。这是因为vue在数据劫持时,只会劫持数组中响应式元素的访问和操作,而不会观察数组元素的属性变化。 要解决这个问题,我们可以使用以下两种方法: 1. 使用$set方法 vue提供了$set方法,用来修改数组中的属性值,并触发响应式更新。$set方法的语法如下: Vue.set…

    Vue 2023年5月29日
    00
  • Vue 数组和对象更新,但是页面没有刷新的解决方式

    当 Vue 组件渲染后,数组和对象更新时,Vue 会检测到更改并自动更新视图。但是有些时候,我们手动地更新数组或对象,可能不会触发视图的更新,这时候需要手动触发一下更新,本文将为你提供完整的解决方案。 解决方法 Vue 提供了 vm.$set、vm.$delete 方法来修改数组或对象中的元素,以保证视图的响应式。 Vue 数组更新的解决方法 假设我们有以下…

    Vue 2023年5月28日
    00
  • 详解vue2.0 资源文件assets和static的区别

    来讲解一下“详解vue2.0 资源文件assets和static的区别”。 什么是资源文件 在前端开发中,想要像引用图片、字体、json数据等资源文件,需要将这些文件放入到项目中的某个目录下,然后才能够在代码中进行使用。 assets和static的区别 在Vue2.0中,我们可以把资源文件放置在两个目录下:assets和static。它们之间的区别在于: …

    Vue 2023年5月27日
    00
  • Vue打包后出现一些map文件的解决方法

    问题描述: 在 Vue 项目中打包后,可能会在控制台看到一些类似于以下的提示: Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/js/chunk-6e951050.578deb7c.js.map 这是因为在…

    Vue 2023年5月27日
    00
  • 解决element DateTimePicker+vue弹出框只显示小时

    要解决element DateTimePicker+vue弹出框只显示小时的问题,可以按照以下步骤操作: 1. 引用element-ui库和相关组件 首先,在Vue项目中引入element-ui库,并按需引入DatetimePicker组件。 <template> <div> <el-date-picker v-model=&q…

    Vue 2023年5月29日
    00
  • Vue实现文本编译详情

    下面是关于Vue实现文本编译的完整攻略。 1. 理解Vue模板和编译过程 Vue框架中,模板是组件渲染的基础,它会被编译成可执行的JavaScript函数的形式。编译过程顺序为: 将模板解析成抽象语法树(Abstract Syntax Tree,AST); 对AST进行静态分析,生成可执行的渲染函数(render function); 最终渲染函数会被执行,…

    Vue 2023年5月27日
    00
  • vue项目中使用多选框的实例代码

    为了让解释更加清晰,我准备从以下几个方面来讲解: 引入vue的核心库和需要的组件 配置数据源和绑定数据 实现多选功能 示例说明 1. 引入vue的核心库和需要的组件 首先,在vue项目中使用多选框,需要引入vue的核心库和需要的组件: <!– 引入vue的核心库 –> <script src="https://unpkg.co…

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