图片地址一定是在允许跨域的情况下,才能进行以下的转换,跨域问题联系后端解决图片跨域
以下是几种图片格式之间的转换:
URL => Blob
function URLToBlob(url, callback) {
// 图片地址需要允许跨域
fetch(url).then(res => res.blob()).then(res => {
callback(res)
})
}
URL => base64
function URLToBase64(url, callback) {
let image = new Image();
// CORS 策略,会有跨域问题
image.setAttribute("crossOrigin",'Anonymous');
image.src = url;
image.onload = function() {
let canvas = document.createElement('canvas');
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
// 将图片插入画布并开始绘制
canvas?.getContext('2d')?.drawImage(image, 0, 0);
// result
let result = canvas.toDataURL('image/png')
callback(result)
};
}
URL => canvas
function URLToBase64(url, callback) {
let image = new Image();
// CORS 策略,会有跨域问题
image.setAttribute("crossOrigin",'Anonymous');
image.src = url;
image.onload = function() {
let canvas = document.createElement('canvas');
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
// 将图片插入画布并开始绘制
canvas?.getContext('2d')?.drawImage(image, 0, 0);
callback(canvas)
};
}
canvas => URL
function canvasToURL(canvas) {
return canvas.toDataURL('image/png')
}
canvas => Blob
function canvasToBlob(canvas, callback) {
canvas.toBlob(blob => {
callback(blob)
}, "image/jpeg")
}
base64 => Blob
function Base64ToBlob(base64) {
const arr = base64.split(",");
const mime = arr[0].match(/:(.*?);/)[1];
const bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
Blob => base64
function BlobToBase64(blob, callback) {
const a = new FileReader();
a.readAsDataURL(blob);
a.onload = function (e) {
callback(e.target?.result);
};
}
Blob => File
function BlobToFile(blob) {
return new window.File([blob], 'imageName', { type: 'text/plain' })
}
FIle => Blob
<input type="file" accept="image/*" onChange={onChange} />
function FileToBlob (file) {
let url = window.URL.createObjectURL(file.item[0]);
return url;
}
const onChange = (e) => {
FileToBlob(e.nativeEvent.srcElement.files)
}