@homecheck/vue-canvas-highlighter
v1.0.0-beta.3
Published
๐ Vue.js๋ฅผ ํ์ฉํ ํ๋์ ์ธ ํด๋ผ์ด์ธํธ-์ฌ์ด๋ ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ฐ ์บ๋ฒ์ค ํ์ด๋ผ์ดํฐ ์ปดํฌ๋ํธ
Downloads
8
Readme
Vue Canvas Highlighter
๐ Live Demo
๐ Vue.js์ Canvas๋ฅผ ํ์ฉํ ํ๋์ ์ธ ํด๋ผ์ด์ธํธ-์ฌ์ด๋ ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ฐ ์บ๋ฒ์ค ํ์ด๋ผ์ดํฐ ์ปดํฌ๋ํธ
Vue 3์ฉ ์บ๋ฒ์ค ํ์ด๋ผ์ดํฐ ์ปดํฌ๋ํธ๋ก, ์ด๋ฏธ์ง ์์ ํ๊ดํ์ผ๋ก ํ์ํ๊ณ ์์ญ์ ๊ฐ์งํ ์ ์์ต๋๋ค.
โจ ์ฃผ์ ๊ธฐ๋ฅ
- ๐๏ธ ๋ค์ํ ๋๊ตฌ: ํ๊ดํ, ์ง์ฐ๊ฐ ๋๊ตฌ
- ๐จ ํ๋ถํ ์์ ํ๋ ํธ: ์ฌ์ ์ ์๋ ์์ ๊ทธ๋ฃน ๋ฐ ์ปค์คํ ์์ ์ง์
- ๐ ํฌ๊ธฐ ์กฐ์ : ํ๊ดํ๊ณผ ์ง์ฐ๊ฐ ํฌ๊ธฐ ์ค์๊ฐ ์กฐ์
- โถ ์คํ ์ทจ์/๋ค์ ์คํ: ์์ ํ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ
- ๐ฑ ํฐ์น ์ง์: ๋ชจ๋ฐ์ผ ๋ฐ ํ๋ธ๋ฆฟ ํ๊ฒฝ ์๋ฒฝ ์ง์
- ๐พ ๋ฐ์ดํฐ ๋ด๋ณด๋ด๊ธฐ: ์์ ๋ด์ฉ์ ์์ถ๋ ํํ๋ก ์ ์ฅ/๋ก๋
- ๐ผ๏ธ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง: ์ด๋ฏธ์ง ํ์ผ์ ๋ฐฐ๊ฒฝ์ผ๋ก ์ค์ ๊ฐ๋ฅ
- ๐ฆ ์์ญ ๊ฐ์ง: ํ์ด๋ผ์ดํธ๋ ์์ญ์ ์๋์ผ๋ก ์ฌ๊ฐํ์ผ๋ก ๋ณํ
- ๐๏ธ LZ ์์ถ: ๋ฐ์ดํฐ ์์ถ์ผ๋ก ํจ์จ์ ์ธ ์ ์ฅ
- ๐ ๋ฐ์ํ ์ขํ: ํฝ์ ๋ฐ ํผ์ผํธ ๊ธฐ๋ฐ ์ขํ ์์คํ ์ง์
๐ฆ ์ค์น
npm install @homecheck/vue-canvas-highlighter๐ ์ฌ์ฉ๋ฒ
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
<template>
<div>
<Highlighter
ref="highlighterRef"
@tool-change="onToolChange"
@color-change="onColorChange"
@data-changed="onDataChanged"
@export-data="onExportData"
@ready="onReady"
/>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { Highlighter } from 'vue-canvas-highlighter'
import type { ToolType } from 'vue-canvas-highlighter'
const highlighterRef = ref<InstanceType<typeof Highlighter>>()
function onToolChange(tool: ToolType) {
console.log('Tool changed:', tool)
}
function onColorChange(color: string) {
console.log('Color changed:', color)
}
function onDataChanged(data: string) {
console.log('Canvas data changed:', data)
}
function onExportData(data: string) {
console.log('Export data:', data)
}
function onReady() {
console.log('Highlighter ready!')
}
</script>TypeScript ์ง์
import type { HighlighterCanvas } from 'vue-canvas-highlighter'
import { ref } from 'vue'
const highlighterRef = ref<HighlighterCanvas>()
// ํ๋ก๊ทธ๋๋งคํฑ API ์ฌ์ฉ
highlighterRef.value?.clearCanvas()
highlighterRef.value?.exportData()
highlighterRef.value?.setTool('highlighter')
highlighterRef.value?.setColor('#ffff00')๐ฏ ์ด๋ฒคํธ
| Event | Payload | Description |
|-------|---------|-------------|
| tool-change | ToolType | ํ์ฌ ๋๊ตฌ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ |
| color-change | string | ํ์ฌ ์์์ด ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ |
| size-change | number | ๋ธ๋ฌ์/์ง์ฐ๊ฐ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ |
| data-changed | string | ์บ๋ฒ์ค ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ |
| export-data | string | ๋ฐ์ดํฐ ๋ด๋ณด๋ด๊ธฐ ์ ๋ฐ์ |
| ready | void | ์ปดํฌ๋ํธ ์ด๊ธฐํ ์๋ฃ ์ ๋ฐ์ |
๐ ๏ธ API ๋ฉ์๋
| Method | Parameters | Return | Description |
|--------|------------|--------|-------------|
| clearCanvas() | - | void | ์บ๋ฒ์ค ๋ด์ฉ ์ ์ฒด ์ญ์ |
| undo() | - | boolean | ๋ง์ง๋ง ์์
์ทจ์ |
| redo() | - | boolean | ์ทจ์๋ ์์
๋ค์ ์คํ |
| exportData() | - | string | ํ์ฌ ์บ๋ฒ์ค ๋ฐ์ดํฐ ๋ฌธ์์ด๋ก ๋ฐํ |
| importData(data) | string | Promise<void> | ๋ฐ์ดํฐ ๋ฌธ์์ด๋ก๋ถํฐ ์บ๋ฒ์ค ๋ณต์ |
| setTool(tool) | ToolType | void | ํ์ฌ ๋๊ตฌ ๋ณ๊ฒฝ |
| setColor(color) | string | void | ํ์ฌ ์์ ๋ณ๊ฒฝ |
| setBrushSize(size) | number | void | ํ๊ดํ ํฌ๊ธฐ ๋ณ๊ฒฝ |
| setEraserSize(size) | number | void | ์ง์ฐ๊ฐ ํฌ๊ธฐ ๋ณ๊ฒฝ |
| setCanvasSize(width, height) | number, number | void | ์บ๋ฒ์ค ํฌ๊ธฐ ๋ณ๊ฒฝ |
| loadBackgroundImage(source) | string \| File \| Blob | Promise<void> | ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ๋ก๋ |
| removeBackgroundImage() | - | void | ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ์ ๊ฑฐ |
| showDetectedRectangles() | - | void | ๊ฐ์ง๋ ์์ญ ํ์ |
| hideDetectedRectangles() | - | void | ๊ฐ์ง๋ ์์ญ ์จ๊น |
| redrawCanvas() | - | void | ์บ๋ฒ์ค ๋ค์ ๊ทธ๋ฆฌ๊ธฐ |
๐ Computed Properties
| Property | Type | Description |
|----------|------|-------------|
| currentTool | ComputedRef<ToolType> | ํ์ฌ ์ ํ๋ ๋๊ตฌ |
| currentColor | ComputedRef<string> | ํ์ฌ ์ ํ๋ ์์ |
| currentBrushSize | ComputedRef<number> | ํ์ฌ ํ๊ดํ ํฌ๊ธฐ |
| currentEraserSize | ComputedRef<number> | ํ์ฌ ์ง์ฐ๊ฐ ํฌ๊ธฐ |
| canUndo | ComputedRef<boolean> | ์คํ ์ทจ์ ๊ฐ๋ฅ ์ฌ๋ถ |
| canRedo | ComputedRef<boolean> | ๋ค์ ์คํ ๊ฐ๋ฅ ์ฌ๋ถ |
| isBackgroundImageLoaded | ComputedRef<boolean> | ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง ๋ก๋ ์ฌ๋ถ |
| isShowDetectedRectangles | ComputedRef<boolean> | ๊ฐ์ง๋ ์์ญ ํ์ ์ฌ๋ถ |
๐จ ๋๊ตฌ ์ข ๋ฅ
type ToolType = 'highlighter' | 'eraser'- highlighter: ํ๊ดํ ๋๊ตฌ - ํ์ด๋ผ์ดํธ ์์ญ ์์ฑ
- eraser: ์ง์ฐ๊ฐ ๋๊ตฌ - ํ์ด๋ผ์ดํธ ์์ญ ์ ๊ฑฐ
๐ ํ์ ์ ์
HighlighterRectangle
type HighlighterRectangle = {
x: number // X ์ขํ (ํฝ์
)
y: number // Y ์ขํ (ํฝ์
)
width: number // ๋๋น (ํฝ์
)
height: number // ๋์ด (ํฝ์
)
color: string // ์์
// ํผ์ผํธ ๊ธฐ๋ฐ ์ขํ (๋ฐ์ํ ๋์)
xPercent: number // X ์ขํ (%)
yPercent: number // Y ์ขํ (%)
widthPercent: number // ๋๋น (%)
heightPercent: number // ๋์ด (%)
}HighlighterExportData
type HighlighterExportData = {
version: string // ๋ฐ์ดํฐ ๋ฒ์
compressed: boolean // ์์ถ ์ฌ๋ถ
width: number // ์บ๋ฒ์ค ๋๋น
height: number // ์บ๋ฒ์ค ๋์ด
regions: HighlighterRegion[] // ์์ญ ๋ฐ์ดํฐ ๋ฐฐ์ด
}HighlighterRegion
type HighlighterRegion = {
color: string // ์์ญ ์์
opacity: number // ํฌ๋ช
๋
bounds: { // ๊ฒฝ๊ณ ์ ๋ณด
x: number
y: number
width: number
height: number
}
pixels?: HighlighterPoint[] // ํฝ์
์ขํ (์ ํ์ )
mask: string // ์์ถ๋ ๋ง์คํฌ ๋ฐ์ดํฐ
}HighlighterStroke
type HighlighterStroke = {
color: string // ํ ์์
size: number // ํ ํฌ๊ธฐ
points: HighlighterPoint[] // ์ ๋ฐฐ์ด
opacity: number // ํฌ๋ช
๋
isFromRegion?: boolean // ์์ญ์์ ๋ณํ๋ ํ์ธ์ง ์ฌ๋ถ
type: ToolType // ๋๊ตฌ ํ์
}HighlighterPoint
type HighlighterPoint = {
x: number // X ์ขํ
y: number // Y ์ขํ
}๐ผ๏ธ ์ง์ ์ด๋ฏธ์ง ํ์
- JPG/JPEG
- PNG
- GIF
- WebP
- SVG
- Data URLs
๐ฑ ๋ชจ๋ฐ์ผ ์ง์
ํฐ์น ์ด๋ฒคํธ๋ฅผ ์๋ฒฝ ์ง์ํ๋ฉฐ, ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์๋ ์ํํ๊ฒ ์๋ํฉ๋๋ค:
- ํฐ์น ๋๋๊ทธ๋ก ๊ทธ๋ฆฌ๊ธฐ
- ํฐ์น ์ ์ค์ฒ ์ง์
- ๋ฐ์ํ ์บ๋ฒ์ค
๐ง ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
# ์ ์ฅ์ ํด๋ก
git clone <repository-url>
cd vue-canvas-highlighter
# ์์กด์ฑ ์ค์น
npm install
# ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run dev
# ๋ฐ๋ชจ ํ์ธ
npm run demo๐ Issue
โ- import์ export ์, ํด์๋๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ ์ง์๋์ง ์์.
๐ ๋ผ์ด์ผ์ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ผ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ๊ณ ํ์ธ์.
