닉네임 에디터 만들기

jinvicky·2025년 2월 9일
0

Intro


커미션을 하다보면 완성 후에 닉네임을 요청하시는 분들이 계신다. 또는 닉네임을 변경하고 싶다는 요청이 온다.
만약에 내가 사이트를 만든다면 기존 신청 이미지들에 대해서 자동으로 닉네임을 추가해서 이미지 다운로드를 할 수 있다면 어떨까 생각을 해봤다.

2022년에 사내에서 스티키밤 기능을 모방해서 구축해본적이 있는데 드래그 기능만 가져와봤다.

Issues


왜이러는 건지 마음이 아프다.
canvas 요소를 생성해서 이미지와 텍스트 위치와 스타일 정보를 모두 그대로 set하려는 내 생각이 틀린 것 같다.
알아서 해주는 게 없을까 뒤적거리다가 html2canvas 라이브러리를 찾았다.
원리 자체는 비슷한데 얘는 useRef를 설정한 요소를 그대로 그려준다고 한다.

// 캔버스 생성
    // const canvas = document.createElement("canvas");
    // const ctx = canvas.getContext("2d");
    // if (!ctx) return;

    // // 이미지와 닉네임 요소 가져오기
    // const img = document.getElementById("img") as HTMLImageElement;
    // const nicknameElement = document.getElementById(
    //   "nickname"
    // ) as HTMLDivElement;

    // // 캔버스 크기 설정
    // canvas.width = img.width; // 이미지의 너비
    // canvas.height = img.height; // 이미지의 높이 + 닉네임의 높이

    // // 이미지 그리기
    // ctx.clearRect(0, 0, canvas.width, canvas.height);
    // ctx.drawImage(img, 0, 0, canvas.width, img.height);

    // // 닉네임 그리기
    // ctx.font = "30px" + font;
    // ctx.fillStyle = "white";
    // ctx.fillText(nicknameElement.innerText, 10, 10); // 이미지 아래에 위치

    // // 이미지로 저장
    // const a = document.createElement("a");
    // a.href = canvas.toDataURL("image/png");
    // a.download = "image.png";
    // a.click();

기존의 얘네 버리고
(지금 생각해보니 이걸 쓰면 자식에서 부모로 던져주는 값이며 파라미터 갯수가 늘어나 골치아팠을 것이다)

const onSaveImage = () => {
    if (!canvasRef.current) return;
    html2canvas(canvasRef.current).then((canvas) => {
      const a = document.createElement("a");
      a.href = canvas.toDataURL("image/png");
      a.download = "image.png";
      a.click();
    });
};

이렇게 했다.


이미지랑 텍스트는 스타일 유지되어서 나온다! 저 캔버스 너비 여백만 없애면 될 것 같다.

실화로 글씨가 검은색이 싫다고 갈색 비스무리하게 써달라는 분들도 계셨다;;
그분들을 생각하면 colorPicker도 도입이 필요해 보인다.

좀 화면이 애매하긴 한데 잘 돌아간다. 하라는 대로 npm install react-color 하면
리액트에서도 정말 쉽게 사용 가능했음.
https://casesandberg.github.io/react-color/

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글

관련 채용 정보