多媒体技术---图片、音视频

231 阅读1分钟

前言

多媒体文件处理,和普通文本处理不同,在此单独记录。

图片上传

语法

<input type="file" accept="image/*" mutiple="mutiple" capture="camera" />

属性

  • accept - 规定可提交的文件类型。
  • capture - 系统所捕获的默认设备。camera(照相机),camcorder(摄像机),microphone(录音)
  • mutiple - 支持多选。当支持多选时,multiple优先级高于capture。

写法

1.<!-- ios 和 安卓都可以调用摄像头 -->
<input type="file" accept="image/*" mutiple="mutiple" capture="camera" /> 
2.<!-- 在安卓无法调用摄像头 -->
<input type="file" name="upload" accept="image/png,image/jpeg,image/gif" capture="camera"> 
3.<!-- 在安卓微信会出现 "No apps can perform this action" 在uc浏览器正常。ios能正常使用。pc端可以使用 -->
<input type="file" accept=".gif,.jpg,.png,.jpeg,.bmp" name="file" /> 
4.<!-- 调用相机 -->
<input type="file" accept="image/*" capture="camera">  
5.<!-- 调用摄像机 -->
<input type="file" accept="video/*" capture="camcorder"> 
6.<!-- 调用录音机 -->
<input type="file" accept="audio/*" capture="microphone"> 
7.<!-- 不加上capture,则只会显示相应的,例如下三种依次是:拍照或图库,录像或图库,录像或拍照或图库, -->
<input type="file" accept="image/*" >
<input type="file" accept="video/*" >
<input type="file" accept="audio/*" >

示例

html部分:

<div class="center">
     <input type="file" class="input-file" name="picture" ref="pictureFront" id="pictureFront"
           @change="changeImage($event,'front')"
           style="position: absolute;z-index: -1;left:-100%;opacity: 0"
           accept="image/*"/>
      <div @click="focus('pictureFront')" class="image">
           <img v-if="picData.front" :src="picData.front" alt="">
           <i v-else class="iconfont icon-shenfenzhengzhengmian"></i>
           <div v-if="!picData.front">点击上传</div>
       </div>
</div>

js部分:

changeImage (e, type) {
    const file = e.target.files[0];
     if (file) {
        this.fileData[type] = file;
        const reader = new FileReader();
        const that = this;
        reader.readAsDataURL(file);
        reader.onload = function (e) {
        // 这里的this 指向reader
        that.picData[type] = this.result;
        };
    }
},
focus (type) {
     this.$refs[type].click();
     // document.getElementById(type).click(); // 和上述同样效果
 },

图片压缩

/**
 * @description 图片压缩
 * @param {string} base64 图片base64数据
 * @param {object} config 配置信息
 * @param {number} config.maxSize 压缩后图片最大尺寸,单位kB
 * @param {number} config.quality 图片质量
 * @param {number} config.rate 图片压缩比例
 * @param {number} config.destWidth 压缩后图片的宽度,优先级高于rate
 * @param {number} config.destHeight 压缩后图片的高度,优先级高于rate
 * @param {function} callback 回调函数
 */
export const compressBase64 = async (base64, config, callback) => {
    const { rate = 1, maxSize = 500, quality = 1, destWidth, destHeight, fileType = 'image/jpeg' } = config
    // 兼容部分机型base64类型
    const img = new Image()
    img.onload = function () {
        // 利用onload生成新的base64
        try {
            // 防止canvas生成以及转换异常
            const canvas = document.createElement('canvas')
            // 等比例压缩
            let lastRate = rate
            if (destWidth || destHeight) {
                const widthRate = destWidth ? destWidth / img.width : 1
                const heightRate = destHeight ? destHeight / img.height : 1
                lastRate = widthRate < heightRate ? heightRate : widthRate
            }
            canvas.width = img.width * lastRate
            canvas.height = img.height * lastRate
            const ctx: any = canvas.getContext('2d')
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
            // 按quality压缩
            const translatedBase64 = canvas.toDataURL(fileType, quality)
            const size = getBase64Size(translatedBase64, fileType)
            if (size > maxSize && rate < 1 && !destWidth && !destHeight) {
                //如果还大,继续压缩
                compressBase64(translatedBase64, config, callback)
            } else {
                callback(translatedBase64)
            }
        } catch (e) {
            callback(base64)
        }
    }
    img.onerror = () => {
        callback(base64)
    }
    img.src = base64
}

参考:

input type="file" 在移动手机端H5页面实现调用本地相册、拍照、录音

一起来玩玩WebGL--第二弹

css sprite雪碧图制作,使用以及相关,图文gif。

从图片裁剪来聊聊前端二进制

一步步实现网页图片的手势拖拽与缩放

一款实用的前端截图工具

仿简书长按文章生成图片效果

一文读懂base64编码

前端数据操作总结

图片懒加载的前世今生

现代化懒加载的方式

少侠,留步,图片预览术

项目需求讨论 - WebView下拍照及图片选择功能

H5拍照上传填坑汇总

图片上传方案详解

图像处理的滤镜算法

[译] 2020 十大 JavaScript 图像处理库

图片加载异常兜底方案

---------------------------------------------------------------------------------------------

谈起音视频,前端能做些什么

「1.4万字」玩转前端 Video 播放器 | 多图预警

七夕了,用代码给心爱的人写一首曲子吧

如何实现前端录音功能

实践!实现纯前端下的音频剪辑处理

视频播放--踩坑小计

如何实现兼容 PC 和微信 H5 的全屏播放小视频

前端音视频的那些名词

Howler.js Web音频播放终极解决方案

初探视频原理和FFmpeg

web视频播放一杆到底

跨平台播放器开发 (四) 开发一个播放器需要用到哪些 FFmpeg 知识

浏览器中的音视频知识总结v1.0

前端流媒体播放从入门到入坑

JS截取视频靓丽的帧作为封面