프로젝트 진행 중 웹 프로젝트의 일부 화면을 캡처한 이미지를 서버에 저장해야 되는 기능을 구현하게 되었다.
하지만 업로드한 이미지와는 다르게 html2canvas를 활용하여 캡처한 이미지는 데이터가 너무 커 서버에 전달하는데 오류가 많이 발생하는 문제가 생겼다.
다행히도 browser-image-compression라는 라이브러리를 발견하게 됐고 이 라이브러리를 통해 이미지 압축, 포맷 설정 크기 조절 등 이미지를 최적화하여 프로젝트의 성능을 향상할 수 있었고, 서버와의 데이터 통신이 원활히 이루어졌다.
npm i html2canvas browser-image-compression
- html2canvas와 browser-image-compression 라이브러리는 설치되어있어야 한다
const handleCaptureElement = async (domRef: React.RefObject<HTMLDivElement>) => {
if (domRef.current) {
const canvas = await html2canvas(domRef.current);
canvas.toBlob(async (captureImageBlob: any) => {
const options = {
maxSizeMB: 0.2,
maxWidthOrHeight: 800,
useWebWorker: true,
};
const compressedImageBlob = await imageCompression(
captureImageBlob,
options
);
return compressedImageBlob;
}, "image/png");
}
- html2canvas 라이브러리를 활용하여 특정 dom요소를 캡처한 데이터를 canvas변수에 저장했다.
- canvas 변수를 toBlob을 활용하여 파일 객체인 Blob으로 전환한다.
- option변수에 사이즈 및 크기 등 옵션을 저장한다
- browser-image-compression의 imageCompression을 활용하여 이미지 파일에 지정한 옵션을 설정하여 파일을 압축한다.
- compressedImageBlob에 지정한 옵션으로 압축된 이미지 파일 데이터가 저장된다.
'React' 카테고리의 다른 글
[Project] 나이스 페이먼츠 테스트용 전자결제 연동하기 (4) - 프론트엔드 폼 구현 2차 (0) | 2023.08.03 |
---|---|
[Project] 나이스 페이먼츠 테스트용 전자결제 연동하기 (2) - 키 발급 및 프론트엔드 진행 1차 (0) | 2023.07.29 |
[Project] 나이스 페이먼츠 테스트용 전자결제 연동하기 (1) - 테스트 상점 개설하기 (0) | 2023.07.24 |