Skip to content

数据导入导出

mark-img 的图形数据是纯 JSON 结构,可以方便地进行序列化、持久化和传输。

导出数据

ts
// 获取所有图形数据
const data = imgMark.getShapePlugin()?.data

// 转为 JSON 字符串
const jsonStr = JSON.stringify(data, null, 2)

导出为文件下载

ts
function exportData() {
	const data = imgMark.getShapePlugin()?.data
	const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' })
	const a = document.createElement('a')
	a.href = URL.createObjectURL(blob)
	a.download = 'shape-data.json'
	a.click()
}

导入数据

ts
// 直接设置数据(替换当前所有图形)
imgMark.getShapePlugin()?.setData(shapeDataList)

从文件导入

ts
function importData(file) {
	const reader = new FileReader()
	reader.readAsText(file, 'utf-8')
	reader.onload = () => {
		const shapeDataList = JSON.parse(reader.result)
		imgMark.getShapePlugin()?.setData(shapeDataList)
	}
}

// 配合 input file 使用
document.querySelector('#import-input').onchange = (e) => {
	const file = e.target.files[0]
	if (file) importData(file)
}

localStorage 持久化

利用事件监听实现自动保存:

ts
import { debounce } from 'lodash-es'

// 自动保存到 localStorage(防抖 300ms)
const autoSave = debounce(() => {
	const data = imgMark.getShapePlugin()?.data || []
	localStorage.setItem('shapeList', JSON.stringify(data))
}, 300)

imgMark.on('shape_plugin_data_change', () => {
	autoSave()
})

// 初始化时从 localStorage 恢复
const savedData = localStorage.getItem('shapeList')
const initList = savedData ? JSON.parse(savedData) : []

const imgMark = new ImageMark({
	el: '#container',
	src: './example.jpg',
	pluginOptions: {
		shape: {
			shapeList: initList,
		},
	},
})

与后端交互

ts
// 保存到后端
async function saveToServer() {
	const data = imgMark.getShapePlugin()?.data
	await fetch('/api/annotations', {
		method: 'POST',
		headers: { 'Content-Type': 'application/json' },
		body: JSON.stringify({ imageId: 'xxx', shapes: data }),
	})
}

// 从后端加载
async function loadFromServer(imageId) {
	const res = await fetch(`/api/annotations/${imageId}`)
	const { shapes } = await res.json()
	imgMark.getShapePlugin()?.setData(shapes)
}

监听数据变化

ts
// setData 时触发
imgMark.on('shape_plugin_set_data', (data) => {
	console.log('数据被替换', data)
})

// 任何数据变化时触发
imgMark.on('shape_plugin_data_change', (data) => {
	console.log('数据变化', data)
})

关于数据结构和完整 API,请查看 Shape Plugin API 和各图形的 API 文档。