이미지 저장 기능 추가

This commit is contained in:
hyojun.choi 2024-06-17 18:01:52 +09:00
parent 5caea968b8
commit 714c762e6d
2 changed files with 77 additions and 9 deletions

View File

@ -15,6 +15,8 @@ export default function Roof() {
handlePaste, handlePaste,
handleRotate, handleRotate,
attachCustomControlOnPolygon, attachCustomControlOnPolygon,
saveImage,
loadImage
} = useCanvas('canvas') } = useCanvas('canvas')
const addRect = () => { const addRect = () => {
@ -181,7 +183,19 @@ export default function Roof() {
> >
45 회전 45 회전
</button> </button>
<button
className="w-30 mx-2 p-2 rounded bg-black text-white"
onClick={() => {saveImage("제목")}}
>
이미지 저장
</button>
<input
type="file"
accept="image/*"
onChange={loadImage}
/>
</div> </div>
<div <div
className="flex justify-center" className="flex justify-center"
style={{ style={{

View File

@ -12,13 +12,11 @@ const CANVAS = {
} }
export function useCanvas(id) { export function useCanvas(id) {
const [canvas, setCanvas] = useState() const [canvas, setCanvas] = useState()
const [isLocked, setIsLocked] = useState(false) const [isLocked, setIsLocked] = useState(false)
const [history, setHistory] = useState([]) const [history, setHistory] = useState([])
const connectMode = useRef(false)
const points = useRef([])
/** /**
* 처음 셋팅 * 처음 셋팅
*/ */
@ -26,6 +24,7 @@ export function useCanvas(id) {
const c = new fabric.Canvas(id, { const c = new fabric.Canvas(id, {
height: CANVAS.HEIGHT, height: CANVAS.HEIGHT,
width: CANVAS.WIDTH, width: CANVAS.WIDTH,
backgroundColor: 'white'
}) })
// settings for all canvas in the app // settings for all canvas in the app
@ -47,21 +46,33 @@ export function useCanvas(id) {
useEffect(() => { useEffect(() => {
if (canvas) { if (canvas) {
initialize() initialize()
canvas.on('object:added', onChange)
canvas.on('object:added', () => {
document.addEventListener('keydown', handleKeyDown)
})
canvas.on('object:modified', onChange)
canvas.on('object:removed', onChange)
} }
}, [canvas]) }, [canvas])
const addEventOnCanvas = () => {
canvas?.on('object:added', onChange)
canvas?.on('object:modified', onChange)
canvas?.on('object:removed', onChange)
canvas?.on('object:added', () => {
document.addEventListener('keydown', handleKeyDown)
})
}
const removeEventOnCanvas = () => {
canvas?.off('object:added')
canvas?.off('object:modified')
canvas?.off('object:removed')
canvas?.off('object:added')
}
/** /**
* 눈금 그리기 * 눈금 그리기
*/ */
const initialize = () => { const initialize = () => {
canvas?.clear() canvas?.clear()
// 기존 이벤트가 있을 경우 제거한다.
removeEventOnCanvas()
const width = canvas?.getWidth() const width = canvas?.getWidth()
const height = canvas?.getHeight() const height = canvas?.getHeight()
@ -94,6 +105,8 @@ export function useCanvas(id) {
addShape(verticalLine) addShape(verticalLine)
} }
addEventOnCanvas()
} }
/** /**
@ -381,6 +394,45 @@ export function useCanvas(id) {
canvas?.requestRenderAll() canvas?.requestRenderAll()
} }
/**
* 이미지로 저장하는 함수
* @param {string} title - 저장할 이미지 이름
*/
const saveImage = (title = 'canvas') => {
const dataURL = canvas?.toDataURL('png')
// 이미지 다운로드 링크 생성
const link = document.createElement('a');
link.download = `${title}.png`;
link.href = dataURL;
// 링크 클릭하여 이미지 다운로드
link.click();
}
/**
* 이미지로 저장한 내용을 업로드 canvas에 그리기
*/
const loadImage = (e) => {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = function(e) {
const dataURL = e.target.result;
fabric.Image.fromURL(dataURL, function(img) {
// 이미지 객체 생성
img.selectable = false
canvas?.add(img);
canvas?.renderAll();
});
};
reader.readAsDataURL(file);
}
return { return {
canvas, canvas,
addShape, addShape,
@ -393,5 +445,7 @@ export function useCanvas(id) {
handlePaste, handlePaste,
handleRotate, handleRotate,
attachCustomControlOnPolygon, attachCustomControlOnPolygon,
saveImage,
loadImage
} }
} }