const imgOnCanvas = (imageSrc) => {
if (!canvasRef) return;
const canvas = canvasRef.current;
const ctx = canvasRef.current.getContext("2d");
setCanvas(canvas)
setCtx(ctx);
const image = new Image();
image.src =imageSrc
image.onload = function() {
console.log("-------------------------");
//입력 파일의 크기를 알아냄
let inW = image.width;
let inH = image.height;
console.log("[1]image 원본 - size",inW,inH);
//--------------------------------------------1
// 캔버스 기본 크기
let canW = canvas.width //300
let canH = canvas.height //150
// console.log("[2]canvas 기본 - size1",canW,canH);
//캔버스 크기를 결정
let reCanW = imgBoxRef.current.clientWidth;
let reCanH = imgBoxRef.current.clientHeight;
canvas.width = reCanW
canvas.height = reCanH
console.log("[3]canvas leftBox - size2",reCanW,reCanH);
//이미지 크기 조정
let imgW ;
let imgH ;
let ratioW = reCanW/inW
let ratioH = reCanH/inH
console.log("비율" ,ratioW, ratioH);
if( reCanW >= inW ){
console.log("캔버스 넓이 > 이미지 원본 넓이");
if( reCanH >= inH ){
console.log("캔버스 높이 > 이미지 원본 높이");
imgW= inW
imgH= inH
}else{
console.log("캔버스 높이 < 이미지 원본 높이");
imgW= inW * ratioH
imgH= reCanH
}
}else{
console.log("캔버스 넓이 < 이미지 원본 넓이");
if( reCanH >= inH ){
console.log("캔버스 높이 > 이미지 원본 높이");
imgW= reCanW
imgH= inH * ratioW
}else{
console.log("캔버스 높이 < 이미지 원본 높이");
if(ratioW > ratioH){
imgW= inW * ratioH
imgH= inH * ratioH
}else{
imgW= inW * ratioW
imgH= inH * ratioW
}
}
}
console.log("[4]최종 출력될 이미지 사이즈",imgW,imgH);
setImageW(imgW)
setImageH(imgH)
//(0,0)을 중심으로 n*m 의 사이즈로 이미지를 그림
ctx.drawImage(image, 0, 0,imgW,imgH);
console.log("-------------------------");
};
}
캔버스 크기와 출력이미지 크기엔 4가지 경우의 수가 있습니다.
(캔버스 크기와 이미지 크기 넓이 높이 중 크기가 큰 경우 작성)
1. 캔버스 넓이 + 캔버스 높이
2. 캔버스 넓이 + 원본이미지 높이
3. 원본이미지 넓이 + 캔버스 높이
4. 원본이미지 넓이 + 원본이미지 높이
4번의 경우 넓이/높이 비율로 한번 더 계산 해줘야합니다.
이해하지 어렵지만
위 코드 잘 뜯어보면^^ check 가능합니다.
(간단한 계산이지만 구글링 실패했고 직접 작성했습니다;;)
728x90
반응형
'Front-end > React' 카테고리의 다른 글
[React] 다국어 기능 적용하기 react-i18next (1) | 2022.10.05 |
---|---|
[React-spinner] loading spinner 적용하기 axios interseptor (1) | 2022.09.27 |
[React] Canvas 레이아웃 2개 겹치기 (0) | 2022.09.23 |
React 리액트 초기 설정 네비 페이지화 기초 세팅 / 리액트 앱 생성 (0) | 2022.09.22 |
[React] 암호화 AES CryptoJS 사용하여 암호화/복호화 하기 (1) | 2022.08.30 |
댓글