canvas图片压缩!

本文详细比较了canvas和svg在HTML中绘制图形的不同,包括语法、渲染方式、应用场景。canvas适用于动画和密集图像,而svg作为矢量图形,更适合图标设计。还介绍了canvas在图片压缩中的应用实例。
摘要由CSDN通过智能技术生成

canvas and svg

canvas是一个可以使用js脚本来绘制图形的HTML元素,它是chrome为我们提供好的一个绘制2D图形的api.

svg是使用XML标签来绘制2D图形的语言,和canvas最大的写法上的区别就是:

(1).svg的写法和编写html标签一样,而canvas则需要使用js;

(2).canvas 是在规定的画布上面逐像素进行渲染的,当我们在浏览器开发者工具对其进行选中时,是不能选中的;

(3).canvas是依赖分辨率是位图,svg不依赖分辨率是可缩放矢量图形;

(4).canvas比较适用在动画、游戏或者需要大量密集图像中,svg因为是渲染在dom中,所以不适合大量使用,不适合游戏应用,一般比较适合做一些icon适用。

编写区别

canvas

  • 编写canvas标签
	<canvas id="canvas" width="800" height="800"></canvas>
  • 获取cancvas dom对象
 	const canvas = document.getElementById('canvas')
  • 获取cancvas 对象
	const ctx = canvas.getContext('2d')
  • 设置绘图属性,调用绘图api
//绘制矩形
        ctx.fillStyle = 'red'
        ctx.fillRect(0,0,50,50)
//绘制线段
        ctx.beginPath()
        ctx.lineWidth = 3
        ctx.strokeStyle = 'blue'
        ctx.moveTo(500, 100)
        ctx.lineTo(600, 200)
        ctx.lineTo(800, 100)
        ctx.lineTo(500, 100)
        ctx.stroke()
        
 //绘制圆形
        ctx.beginPath()


        ctx.lineWidth = 2
        ctx.strokeStyle = 'green'
        ctx.fillStyle = 'red'
        ctx.arc(200,200,50,0,2*Math.PI)
        ctx.stroke()
        ctx.fill()

//绘制点
        ctx.beginPath()
        ctx.lineWidth = 1
        ctx.strokeStyle = 'blue'
        ctx.moveTo(400, 400)
        ctx.lineTo(401, 401)
        ctx.stroke()

svg

和书编写html标签一样

  • 编写一个svg 容器
<svg width="800" height="800"></svg>
  • 绘制矩形
<svg width="800" height="800">
  <rect
            width="50"
            height="50"
            style="fill: red;"
        >
        </rect>
    </svg>
      
  • 绘制圆,其中设置图形的样式,可以是属性的方式,也可以现在style里面
<svg width="800" height="800">
	<circle
            cx="200"
            cy="200"
            r="50"
            stroke="green"
            style="stroke-width: 2;fill: red;"
        >

        </circle>
  </svg>

canvas实际使用场景

图片压缩

前端图片压缩,已经有现成的api可以调用,主要还是通过canvas的drawImage api 把图片绘制在规定大小的画布上。

  • 上传图片时,通过调用new FileReader(),获取图片的base64资源
	upload.addEventListener('change', function(e) {
            const [ file ] = e.target.files
            if (!file) return

            const {type:fileType, size: fileSize} = file
            if ( ACCEPT.indexOf(fileType) < 0 ) {
                upload.value = ''
                return alert('类型不支持')
            }
            if ( fileSize > MAXSIZE ) {
                upload.value = ''
                 alert(`文件大小超出${MAXSIZE_STR}`)
                return
            }
            //图片压缩
            //1.将图片转为base64
            converImageToBase64(file, compress)
            
        })
function converImageToBase64(file, callback) {
            let reader = new FileReader()
            reader.addEventListener('load', function(e) {
                const base64Img = e.target.result
                callback && callback(base64Img)
                reader = null
            })
            reader.readAsDataURL(file)
        }
  • 图片压缩核心 drawImage
function compress(base64Img, callback) {
            let maxW = 400 // 最大宽
            let maxH = 400 // 最大高
            const image = new Image()
            image.addEventListener('load', function(e) {
                let ratio; //图片压缩比
                let needCompress = false //是否需要压缩
                if (maxW < image.naturalWidth) { 
                //如果上传图片的宽大于限制的宽度,那么需要压缩,用图片的宽度 / 最大的宽度
                此时 maxW = 400,maxH也等比例缩放ratio
                    needCompress = true
                    ratio = image.naturalWidth / maxW
                    maxH = image.naturalHeight / ratio
                }
                if (maxH < image.naturalHeight) {
                //图片高度比maxH大
                    needCompress = true
                    ratio = image.naturalHeight / maxH
                    maxW = image.naturalWidth / ratio
                }

                if (!needCompress) { //如果不需要压缩,也就是上传的图片宽高在限制的范围内,就用图片的原始宽高
                    maxW = image.naturalWidth
                    maxH = image.naturalHeight
                }
                const canvas = document.createElement('canvas')
                canvas.setAttribute("id", "canvas")
                canvas.width = maxW
                canvas.height = maxH
                canvas.style.display = 'none'
                document.body.appendChild(canvas)

                const ctx = canvas.getContext('2d')
                ctx.clearRect(0,0,maxW, maxH)
                ctx.drawImage(image, 0, 0, maxW, maxH)
                const compressImage = canvas.toDataURL('image/jpeg', 0.8)
                callback && callback(compressImage)
                canvas.remove()
            })
            image.src = base64Img
            document.body.appendChild(image)
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用Canvas进行图片压缩时,可以使用CanvasRenderingContext2D.drawImage()方法来指定图片在Canvas上的绘制区域和尺寸。首先创建一个Canvas元素,并获取其2D上下文对象。然后设置Canvas的宽高为所需的压缩尺寸。接下来,使用drawImage()方法将原始图片绘制到Canvas上,并指定绘制区域的坐标和尺寸,即左上角坐标为(0, 0),绘制区域的宽高为Canvas的宽高。最后,可以通过Canvas的toDataURL()方法将压缩后的图片转换为base64格式或者生成对应的新图片。如果需要将图片转换为Blob对象,可以使用Canvas的toBlob()方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Canvas drawImage() 方法实现图片压缩](https://blog.csdn.net/qq_53225741/article/details/128504914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [canvas实现图片压缩](https://blog.csdn.net/runner_123/article/details/105815597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JS图片压缩上传 canvas 压缩图片](https://download.csdn.net/download/qq_21772835/12205970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiahao778

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值