canvas 绘制图片下载

本文介绍了一个使用HTML5 Canvas绘制彩色几何图形的例子,并提供了保存画布为不同图片格式的功能。通过JavaScript实现了多边形的绘制,每个图形都有不同的颜色,同时提供了一个按钮用于将当前画布内容保存为图片。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        
    </head>
    <body>
        <canvas id="canvas" width="400" height="400"></canvas>
        <div>
            <button id="save">保存</button>
        </div>
        <script type="text/javascript">
            var arr = [
                {locations:[[0,0],[200,200],[0,400]],color:"red"},
                {locations:[[0,0],[400,0],[200,200]],color:"orange"},
                {locations:[[0,400],[100,300],[200,400]],color:"yellow"},
                {locations:[[100,300],[200,200],[300,300],[200,400]],color:"green"},
                {locations:[[300,100],[200,200],[300,300]],color:"blue"},
                {locations:[[300,100],[400,0],[400,200],[300,300]],color:"indigo"},
                {locations:[[200,400],[400,400],[400,200]],color:"purple"}
            ];
            var oCanvas = document.getElementById("canvas");
            var ctx = oCanvas.getContext("2d");
            for(let i=0;i<arr.length;i++){
                draw(arr[i],ctx);
            }
             
            function draw(item,ctx){
                ctx.beginPath();
                ctx.moveTo(item.locations[0][0],item.locations[0][1]);
                for(let i = 0;i<item.locations.length;i++){
                    let x = item.locations[i][0];
                    let y = item.locations[i][1];
                    ctx.lineTo(x,y);
                    console.log(1234567)
                }
                ctx.closePath();
                 
                ctx.fillStyle = item.color;
                ctx.fill();
                 
                ctx.strokeStyle = "#000";
                ctx.lineWidth = 2;
                ctx.stroke();
            }
            var imgId = document.getElementById("imgId");
            document.getElementById("save").onclick = function (){
                downLoad(saveAsPNG(canvas));
            }
             
            // 保存成png格式的图片
            function saveAsPNG(canvas) {
                return canvas.toDataURL("image/png");
            }
             
            // 保存成jpg格式的图片
            function saveAsJPG(canvas) {
                return canvas.toDataURL("image/jpeg");
            }
             
            // 保存成bmp格式的图片  目前浏览器支持性不好
            function saveAsBMP(canvas) {
                return canvas.toDataURL("image/bmp");
            }
             
            /**
             * @author web得胜
             * @param {String} url 需要下载的文件地址
             * */
            function downLoad(url){
                var oA = document.createElement("a");
                oA.download = '';// 设置下载的文件名,默认是'下载'
                oA.href = url;
                document.body.appendChild(oA);
                oA.click();
                oA.remove(); // 下载之后把创建的元素删除
                // const content = res;
                // const blob = new Blob([content]);
                // if ('msSaveOrOpenBlob' in navigator) {
                //     window.navigator.msSaveOrOpenBlob(blob, fileName);
                //     return;
                // }
                // const elink = document.createElement("a");
                // elink.download = fileName;
                // elink.style.display = "none";
                // elink.href = URL.createObjectURL(blob);
                // document.body.appendChild(elink);
                // elink.click();
                // URL.revokeObjectURL(elink.href);
                // document.body.removeChild(elink);
            }
        </script>
    </body>
</html>

<think>好的,我现在需要解决用户在UniApp中使用Canvas绘制图片并实现下载功能的问题。用户提到了之前遇到的网络图片绘制空白问题,以及清除画布的方法,所以我要结合这些引用内容来给出解决方案。 首先,用户想绘制网络图片到Canvas并下载。根据引用[1],直接绘制网络图片会导致空白,必须先用uni.getImageInfo获取图片信息。这一步是关键,因为Canvas需要本地临时路径才能正确绘制。 接下来,我需要确认如何正确使用Canvas上下文。引用[2]中提到使用uni.createCanvasContext创建上下文对象,并用clearRect清除画布。所以在示例代码中,应该包括创建上下文和清除画布的步骤。 然后,绘制完成后如何保存图片。用户需要下载功能,所以需要用到uni.canvasToTempFilePath将Canvas转换为临时文件路径,之后用uni.saveImageToPhotosAlbum保存到相册。需要注意权限问题,需要用户授权写入相册的权限。 另外,要确保代码结构正确,包括在methods中定义drawImage方法,处理异步操作,比如使用async/await来处理uni.getImageInfo的异步获取。同时,错误处理也很重要,比如捕获可能出现的异常,并给出提示。 还需要考虑Canvas的样式和尺寸是否与实际绘制的内容匹配,比如设置Canvas的width和height属性,避免图片变形或显示不全。 最后,生成相关问题时要围绕用户可能遇到的疑问,比如权限处理、本地图片绘制、清除画布方法等,确保覆盖常见的使用场景和潜在问题。</think>在UniApp中实现Canvas绘制网络图片并下载功能,需解决跨域资源加载和本地临时文件转换问题。以下是具体实现步骤及代码示例: ### 一、实现步骤 1. **获取网络图片信息** 使用$uni.getImageInfo$获取图片临时路径,解决Canvas无法直接绘制网络资源的问题[^1] 2. **创建Canvas上下文** 通过$uni.createCanvasContext$创建绘图对象[^2] 3. **绘制图片到Canvas** 使用$drawImage$方法绘制处理后的图片 4. **生成临时文件路径** 通过$uni.canvasToTempFilePath$转换Canvas内容 5. **保存到本地相册** 使用$uni.saveImageToPhotosAlbum$实现下载 ### 二、示例代码 ```vue <template> <view> <canvas canvas-id="myCanvas" style="width:300px;height:300px"/> <button @click="saveImage">保存图片</button> </view> </template> <script> export default { methods: { async drawImage() { try { // 获取网络图片信息 const res = await uni.getImageInfo({ src: 'https://example.com/image.jpg' }) // 创建画布上下文 const ctx = uni.createCanvasContext('myCanvas', this) // 清除旧画布内容 ctx.clearRect(0, 0, 300, 300) // 绘制图片(等比例缩放) ctx.drawImage(res.path, 0, 0, 300, 300) ctx.draw() } catch (e) { uni.showToast({ title: '图片加载失败', icon: 'none' }) } }, async saveImage() { try { // 生成临时文件路径 const { tempFilePath } = await uni.canvasToTempFilePath({ canvasId: 'myCanvas' }) // 保存到相册 await uni.saveImageToPhotosAlbum({ filePath: tempFilePath }) uni.showToast({ title: '保存成功' }) } catch (e) { uni.showToast({ title: '保存失败', icon: 'none' }) } } }, mounted() { this.drawImage() } } </script> ``` ### 三、关键注意事项 1. **权限配置** 需在manifest.json添加相册写入权限: ```json "permission": { "scope.writePhotosAlbum": { "desc": "需要保存图片到相册" } } ``` 2. **跨域问题处理** 若图片存储在第三方服务器,需在服务端配置CORS策略或使用uni.downloadFile预先下载 3. **画布清除技巧** 使用$clearRect$前建议先填充白色背景: ```js ctx.fillStyle = '#ffffff' ctx.fillRect(0, 0, 300, 300) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值