h5图片下载

通过链接保存图片,是很常见的需求,我这里总结了几种比较好用的方式,以下方式在pc中基本适用

这里的下载最终都使用了adownload的属性,区别在于前置对图片的处理。(直接通过图片链接使用并不适用大部分机型)

1.通过图片加载,canvas转base64,a超链的download属性下载图片(推荐方法,适用于大部分机型)

tips:  .bin文件需要加文件后缀命名(这里为photo.png)

            downloadIamge(imgsrc, name) {//下载图片地址和图片名
			  let image = new Image();
			  // 解决跨域 Canvas 污染问题
			  image.setAttribute("crossOrigin", "anonymous");
			  image.onload = function() {
			    let canvas = document.createElement("canvas");
			    canvas.width = image.width;
			    canvas.height = image.height;
			    let context = canvas.getContext("2d");
			    context.drawImage(image, 0, 0, image.width, image.height);
			    let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
			    let a = document.createElement("a"); // 生成一个a元素
			    let event = new MouseEvent("click"); // 创建一个单击事件
			    a.download = name || "photo.png"; // 设置图片名称
			    a.href = url; // 将生成的URL设置为a.href属性
			    a.dispatchEvent(event); // 触发a的单击事件
			  };
			  image.src = imgsrc;
			},

2.于上相同,不同的是用了 window.URL.createObjectURL 处理图片。(测试后,部分机型并没有window.URL,或者无法通过这个进行转化)

              downloadImgByBlob(url) {
				var img = new Image()
				img.onload = function() {
					var canvas = document.createElement('canvas')
					canvas.width = img.width
					canvas.height = img.height
					var ctx = canvas.getContext('2d')
					// 将img中的内容画到画布上
					ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
					// 将画布内容转换为Blob
					canvas.toBlob((blob) => {
						// blob转为同源url
						var blobUrl = window.URL.createObjectURL(blob)
						// 创建a链接 
						var a = document.createElement('a')
						a.href = blobUrl
						a.download = 'younei.png' //文件名称,不填默认为当前请求名称
						// 触发a链接点击事件,浏览器开始下载文件
						a.click()
					})
				}
				img.src = url
				// 必须设置,否则canvas中的内容无法转换为blob
				img.setAttribute('crossOrigin', 'Anonymous')
			},

3.这个使用的也是URL.createObjectURL,区别在于触发a事件的时候使用了另外的方式,因此存在同样的问题。(也许能跟第一种结合一下)

                savePic(Url){
					// Url = this.dialogImgUrl //图片路径,也可以传值进来
					var triggerEvent = "touchstart"; //指定下载方式
				    var blob=new Blob([''], {type:'application/octet-stream'}); //二进制大型对象blob
				    var url = URL.createObjectURL(blob); //创建一个字符串路径空位
				    var a = document.createElement('a'); //创建一个 a 标签
				    a.href = Url;  //把路径赋到a标签的href上
				    //正则表达式,这里是把图片文件名分离出来。拿到文件名赋到a.download,作为文件名来使用文本
				    a.download = Url.replace(/(.*\/)*([^.]+.*)/ig,"$2").split("?")[0]; 
				   
				    //代替方法。创建鼠标事件并初始化(后面这些参数我也不清楚,参考文档吧 https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent)
					var e = new MouseEvent('click', ( true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null));  
					//派遣后,它将不再执行任何操作。执行保存到本地
				    a.dispatchEvent(e); 
				    //释放一个已经存在的路径(有创建createObjectURL就要释放revokeObjectURL)
				    URL.revokeObjectURL(url);  
				},

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 要实现H5页面下载图片而不跳转页面,可以通过以下步骤来实现。首先,在H5页面中,可以使用JavaScript的方式来下载图片。可以使用`<a>`标签的`download`属性来实现下载功能,例如: ```html <a href="图片链接" download>下载图片</a> ``` 这样点击下载图片链接时,图片将会被下载到本地,而不会跳转到新的页面。另外,你也可以使用JavaScript的`XMLHttpRequest`对象来发送请求并下载图片,然后使用`Blob`对象将图片保存到本地。具体实现方式可以参考相关的JavaScript教程。 另外,如果你是在小程序中嵌入H5页面,可以通过在小程序中使用`web-view`组件来展示H5页面。在小程序中,你可以通过配置`web-view`组件的`src`属性来指定要展示的H5页面的链接。这样,用户在小程序中点击下载图片的链接时,图片将会被下载到本地,而不会跳转到新的页面。需要注意的是,小程序中的`web-view`组件只能展示符合小程序安全域名的链接,否则将无法正常展示。 综上所述,你可以在H5页面中使用JavaScript的方式来下载图片,或者在小程序中嵌入H5页面并使用`web-view`组件来展示H5页面并实现下载图片的功能。 #### 引用[.reference_title] - *1* [小程序和H5页面的相互跳转](https://blog.csdn.net/weixin_39849387/article/details/114017154)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Android与H5交互 -- 点击H5跳转到 Android原生 页面 ,webview与h5(js)交互](https://blog.csdn.net/afufufufu/article/details/127614048)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值