리액트에서 이미지 마스킹하기
<Button variant="contained" component="label">
아이콘 업로드
<input
accept="image/*"
multiple
type="file"
hidden
onChange={(e: ChangeEvent<HTMLInputElement>): void => handleUploadIcon(e)}
/>
</Button>
먼저, 업로드 버튼을 만들고, 모든이미지를 허용하고, file타입으로 input태그를 만든다.
const handleUploadIcon = (e: ChangeEvent<HTMLInputElement>) => {
setImgFile(e.target.files[0])
const imagePromise = e.target.files[0].arrayBuffer().then((buf) => {
return makeImage(buf, figure, borderColor)
})
imagePromise.then((resized) => {
const fileReader = new FileReader()
fileReader.readAsDataURL(resized)
fileReader.onload = (e) => {
const image = new Image()
image.src = e.target.result as string
image.onload = () => {
const base64Img = e.target.result as string
// //! 아이콘 해쉬 변환
const hash = CryptoJS.SHA256(base64Img).toString()
const file = dataURLtoFile(base64Img, 'MaskedImage.png')
dispatch(setInfo(base64Img, 'base64Img'))
dispatch(setInfo(hash, '아이콘 추가'))
setFile(file)
}
}
})
}
makeImage함수로 이미지를 masking 그리고, dataURLtoFile 함수로 파일객체로 만들어준다.
useEffect(() => {
if (imgFile) {
const imagePromise = imgFile.arrayBuffer().then((buf: ArrayBuffer) => {
return makeImage(buf, figure, borderColor)
})
imagePromise.then((resized: Blob) => {
const fileReader = new FileReader()
fileReader.readAsDataURL(resized)
fileReader.onload = (e) => {
const image = new Image()
image.src = e.target.result as string
image.onload = () => {
const base64Img = e.target.result as string
const hash = CryptoJS.SHA256(base64Img).toString()
const file = dataURLtoFile(base64Img, 'MaskedImage.png')
dispatch(setInfo(base64Img, 'base64Img'))
dispatch(setInfo(hash, '아이콘 추가'))
setFile(file)
}
}
})
}
}, [borderImgState, borderColor])
useEffect(() => {
if (icon && file) {
dispatch(setInfo(file, 'uploadFile'))
dispatch(setInfo(borderImg, 'borderImgState'))
dispatch(setInfo(borderColor, 'borderColor'))
}
}, [icon, file])
border가 바뀔때마다, 그리고 img가 바뀔때마다, masking 함수를 실행한다.
읽는 시간 4분