js图片文件的转换

js图片文件的转换

在做H5软件时发现H5获取的图像信息无法直接上传到腾讯的对象存储中,要上传到对象存储要传入的是文件的对象信息,这可用input file标签选取图片可以直接获得文件信息。但是我已经使用了H5的图片选取返回,目前只有一个本地路径要如何将图片上传过去?

解决这个问题的关键是将图片路径转化成腾讯云可以处理的文件对象,使用H5的文件读取将对象上传到腾讯云并不能显示出图片,那就只能通过js专门处理图片在将处理好的图片转成文件对象。

在这里插入图片描述
1.图片转Base64
获取到图片路径后可以直接通过路径将图片转为成Base64编码

var image = new Image();
image.src = target;//图片路径
image.onload = function(){ 
  var base64 = getBase64Image(image);
}  

//将图片转成base64 编码
function getBase64Image(img) {
   var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height);
    var ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();
    var dataURL = canvas.toDataURL("image/"+ext);
    return dataURL;
}

2.Base64转文件
下一步将base64转成文件对象

//第一个参数为base64编码,后一个为文件名因为上传到腾讯云会重命名所以就这里就随便输了
var flie=dataURLtoFile(base64,"ssss");

//base64转文件对象
function dataURLtoFile(dataurl, filename) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    } 
    return new File([u8arr], filename, {type:mime});
}

3.上传图片
获取到文件对象就能将图片完整的上传到腾讯云了

完整代码

var filename="GS_yhtx/test.jpg";//文件名
//通过H5方法进行图片压缩
 plus.zip.compressImage({  
          src:useeedata.tx,//需要压缩的图片路径  
          dst:"_doc/"+newupimg+".jpg",//保存的图片路径  
          width:'128px',//压缩后图片宽度  
          quality:80,//图片质量  
          overwrite:true//是否覆盖  
      },    
      function(event){   
        //target 压缩完成返回的路径
      	var target = event.target;
      	//size  压缩完成的图片大小 以字节为单位
      	var size = event.size;
      	//图片处理
		var image = new Image();
		image.src = target;
		image.onload = function(){ 
		  //通过路径转base64 
		  var base64 = getBase64Image(image);
		  //通过base64转文件对象
		  var flie=dataURLtoFile(base64,"ssss")
		  //上传到腾讯云
		  cos.putObject({ 
			Bucket: '',//存储桶
			Region: '',//地区
			Key:filename,//文件名
			Body:flie,  //上传文件
			onProgress: function(progressData) {
			}, 
			}, function(err, data) {
			//上传完成拼接上"https://"就可访问图片了
			 plus.storage.setItem("wanitx","https://"+data.Location);
		});	
   }   	 
 },function(error) {   
});    
//base64转文件对象
function dataURLtoFile(dataurl, filename) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
         bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
     while(n--){
         u8arr[n] = bstr.charCodeAt(n);
     } 
     return new File([u8arr], filename, {type:mime});
}
//将图片转成base64 编码
 function getBase64Image(img) {
     var canvas = document.createElement("canvas");
     canvas.width = img.width;
     canvas.height = img.height;
     var ctx = canvas.getContext("2d");
     ctx.drawImage(img, 0, 0, img.width, img.height);
     var ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();
     var dataURL = canvas.toDataURL("image/"+ext);
     return dataURL;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Vue 中将图片转换文件流的方法与纯 JavaScript 类似,可以使用 HTML5 中的 File API 和 FormData 对象。具体步骤如下: 1. 在模板中使用 input 元素的 type 属性设置为 file,让用户选择图片文件。 2. 在 Vue 实例中使用 FileReader 对象,将图片文件转换为二进制数据流。 3. 将二进制数据流转换为 Blob 对象,并将其作为 FormData 对象的一个字段,然后将 FormData 对象通过 axios 或 fetch API 发送到后端。 以下是一个使用 axios 将图片文件流传递到后端的示例代码: ```html <template> <div> <input type="file" @change="handleFileChange"> <button @click="upload">上传</button> </div> </template> <script> import axios from 'axios'; export default { data() { return { file: null }; }, methods: { handleFileChange(event) { this.file = event.target.files[0]; }, upload() { const reader = new FileReader(); reader.onload = () => { const blob = new Blob([reader.result], { type: this.file.type }); const formData = new FormData(); formData.append('image', blob, this.file.name); axios.post('/upload', formData).then(response => { console.log('上传成功', response.data); }).catch(error => { console.log('上传失败', error); }); }; reader.readAsArrayBuffer(this.file); } } }; </script> ``` 在上面的示例代码中,首先使用 input 元素让用户选择图片文件,然后使用 FileReader 对象将图片文件转换为二进制数据流。接着,将二进制数据流转换为 Blob 对象,并将其添加到 FormData 对象中。最后,使用 axios 将 FormData 对象发送到后端。 需要注意的是,在使用 axios 或其他 AJAX 库上传文件时,需要将请求头的 Content-Type 设置为 multipart/form-data,以便服务器能够正确解析上传的文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值