snapshot from both img and video

main
km0 1 year ago
parent 3456371e39
commit d8e7158455

@ -31,19 +31,12 @@
createPreview(dropFile.value)
}
const container = computed(()=>{
if (fileType.value == 'image') return 'img'
if (fileType.value == 'video') return 'video'
return 'div'
})
const createPreview = async (file) => {
loading.value = true
// get file type
fileType.value = file.type.toLowerCase().substr(0, file.type.indexOf("/"))
let filePath = (window.URL || window.webkitURL).createObjectURL(file)
// store the initial file
@ -52,52 +45,66 @@
// if file is video create a snapshot and use that instead of the orignal file
if (fileType.value == 'video') {
fileToRead = await videoSnapshot(filePath)
filePath = (window.URL || window.webkitURL).createObjectURL(fileToRead)
}
if (fileType.value == 'image') {
fileToRead = await imageSnapshot(filePath)
}
filePath = (window.URL || window.webkitURL).createObjectURL(fileToRead)
emit('file', fileToRead)
const reader = new FileReader()
reader.readAsDataURL(fileToRead)
reader.onloadend = (e) => {
if (e.target.readyState == FileReader.DONE) {
imageSnapshot(filePath)
thumb.value.src = filePath
emit('upload', filePath)
loading.value = false;
}
}
}
// TODO: scale image to thumb size
const imageSnapshot = (url) => {
thumb.value.src = url
emit('upload', url)
loading.value = false;
return new Promise((resolve, reject)=>{
let image = document.createElement('img')
image.src = url
image.onload = () => {
let file = snapshot(image)
resolve(file)
}
})
}
const videoSnapshot = (url) => {
// wrap logic into a promise, in order to wait for the 'canplay' event
return new Promise((resolve, reject)=>{
let video = document.createElement('video')
video.src = url
const snapshot = async () => {
let canvas = document.createElement('canvas')
canvas.width = 640
canvas.height = 360
let ctx = canvas.getContext('2d')
ctx.drawImage(video, 0, 0, canvas.width, canvas.height)
thumb.value.src = canvas.toDataURL('image/jpeg')
loading.value = false
video.removeEventListener('canplay', snapshot)
let file = await base64ToBlob(thumb.value.src, 'snapshot')
resolve(file)
}
video.addEventListener('canplay', snapshot)
video.addEventListener('canplay', ()=>{
let file = snapshot(video)
video.removeEventListener('canplay', snapshot)
resolve(file)
})
})
}
const snapshot = async (source) => {
let canvas = document.createElement('canvas')
console.log(source)
let width = source.tagName =='IMG' ? source.naturalWidth : source.videoWidth
let height = source.tagName == 'IMG' ? source.naturalHeight : source.videoHeight
canvas.width = 640
canvas.height = 360
let ctx = canvas.getContext('2d')
ctx.drawImage(source, 0, 0, canvas.width, canvas.height)
let file = await base64ToBlob(canvas.toDataURL('image/jpeg'), 'snapshot')
return file
}
</script>

Loading…
Cancel
Save