vue实现图片搜索
Vue实现图片搜索功能
使用HTML5的File API获取图片
通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。
<template>
<input type="file" accept="image/*" @change="handleImageUpload">
</template>
<script>
export default {
methods: {
handleImageUpload(event) {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
this.searchImage(e.target.result);
};
reader.readAsDataURL(file);
}
}
}
</script>
将图片转换为Base64或Blob格式
上传的图片需要转换为Base64编码或Blob对象,便于后续处理或发送到服务器。
methods: {
searchImage(imageData) {
// Base64格式可直接用于预览或上传
console.log(imageData);
// 或转换为Blob
fetch(imageData)
.then(res => res.blob())
.then(blob => {
this.uploadImage(blob);
});
}
}
使用Canvas处理图片
通过Canvas可以对图片进行缩放、裁剪等预处理,减少上传数据量。
methods: {
resizeImage(imageData, maxWidth, maxHeight) {
return new Promise((resolve) => {
const img = new Image();
img.onload = () => {
const canvas = document.createElement('canvas');
let width = img.width;
let height = img.height;
if (width > maxWidth) {
height *= maxWidth / width;
width = maxWidth;
}
if (height > maxHeight) {
width *= maxHeight / height;
height = maxHeight;
}
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, width, height);
resolve(canvas.toDataURL('image/jpeg', 0.7));
};
img.src = imageData;
});
}
}
调用图片搜索API
将处理后的图片数据发送到后端搜索API,可以使用Axios库。
methods: {
async uploadImage(processedImage) {
try {
const formData = new FormData();
formData.append('image', processedImage);
const response = await axios.post('/api/image-search', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
this.results = response.data.results;
} catch (error) {
console.error('搜索失败:', error);
}
}
}
显示搜索结果
获取到搜索结果后,在页面中展示匹配的图片列表。
<template>
<div class="results">
<div v-for="(result, index) in results" :key="index">
<img :src="result.url" :alt="result.title">
<p>{{ result.title }}</p>
</div>
</div>
</template>
实现拖拽上传功能
增强用户体验,支持拖拽图片到指定区域上传。
<template>
<div
class="drop-zone"
@dragover.prevent="dragOver"
@dragleave="dragLeave"
@drop.prevent="handleDrop"
:class="{ 'active': isDragging }"
>
拖拽图片到此处
</div>
</template>
<script>
export default {
data() {
return {
isDragging: false
};
},
methods: {
dragOver() {
this.isDragging = true;
},
dragLeave() {
this.isDragging = false;
},
handleDrop(e) {
this.isDragging = false;
const file = e.dataTransfer.files[0];
if (file && file.type.match('image.*')) {
const reader = new FileReader();
reader.onload = (event) => {
this.searchImage(event.target.result);
};
reader.readAsDataURL(file);
}
}
}
};
</script>
使用第三方服务实现
可以考虑集成第三方图片搜索服务如Google Cloud Vision、百度图像搜索等,通过它们的API实现更专业的图片识别功能。
methods: {
async callGoogleVisionAPI(imageData) {
const response = await axios.post(
'https://vision.googleapis.com/v1/images:annotate?key=YOUR_API_KEY',
{
requests: [{
image: {
content: imageData.split(',')[1]
},
features: [{
type: 'WEB_DETECTION'
}]
}]
}
);
this.results = response.data.responses[0].webDetection.visuallySimilarImages;
}
}






