최근 모바일 단말에서 아바타 업로드 기능을 설계할 때 원래는 로 formData를 통해 직접 업로드했지만, 실제 사용법은 너무 큰 사진(촬영한 사진)입니다. 고화소 휴대폰 등) 업로드 시간이 너무 길면 업로드 실패의 원인이 되며, 매번 이미지 원본 크기를 업로드(백그라운드 처리 압축)하면 사용자 경험에 큰 영향을 미치게 되므로 압축 방법을 연구했습니다. 다음은 몇 가지 아이디어와 생각입니다.
1. 로컬 이미지를 가져와서 캔버스에 그립니다. 여기서 어려운 점은 브라우저의 보호 메커니즘으로 인해 로컬 파일의 이미지 경로를 직접 얻을 수 없기 때문에 로컬 이미지를 base64 형식으로 컴파일한 다음 업로드해야 한다는 것입니다. 코드는 다음과 같습니다.
JavaScript 코드클립보드에 콘텐츠 복사
var result = document.getElementById("/* 오류 메시지 표시 블록 */")
var input = document.getElementById("/* 파일 태그 업로드 */")
if(typeof FileReader === '정의되지 않음'){
result.innerHTML = "
죄송합니다. 귀하의 브라우저는 FileReader
를 지원하지 않습니다.";
input.setAttribute('비활성화','비활성화');
}
그밖에{
input.addEventListener(
'변경',readFile,false);
}
함수
readFile(){
var
file = this.files[0]
if
(!/image/w /.test(file.type)){
warning("파일이 이미지 형식인지 확인하세요."
)
반환
거짓
}
var
reader = new FileReader()
reader.readAsDataURL(파일)
reader.onload = 함수
(e){
// this.result 컴파일된 이미지 인코딩은 src로 직접 표시 가능
}
}
2. 캔버스에서 이미지 처리
JavaScript 코드
클립보드에 콘텐츠 복사
var c=document.getElementById("/* 캔버스 태그 ID */"); >
var cxt=c.getContext("2d")
var img=new 이미지()
img.src=
/* 획득한 이미지 인코딩 주소 */
var width = img.width;
var
높이 = img.height;
dic = 높이 / 너비
c.width = 200;
//이미지 압축 기준은 200px을 기준으로 계산됩니다.
c.height = 200 * dic
cxt.clearRect(0,0,200,200*dic)
cxt.drawImage(img,0,0,200,200*dic)
var
finalURL = c.toDataURL()
// 얻은 최종 URL은 img 태그를 업로드하거나 직접 생성하는 데 사용할 수 있는 압축된 이미지 인코딩입니다.
여기서 주의할 몇 가지 사항은 다음과 같습니다.
1. 로컬에서 디버깅할 때 오류가 발생합니다. 원인은 크로스 도메인 문제이므로 서버 측에서 디버깅해야 합니다.
2. 캔버스의 drawImage() 메소드에는 이미지 자르기 기능이 있지만, 이미지 늘이기 및 자르기를 동시에 작성하면 자르기 메소드가 먼저 실행됩니다.
3. AJAX를 사용하여 이미지 인코딩을 업로드하면 인코딩의 더하기 기호가 공백으로 변환되어 백그라운드 컴파일이 실패하게 됩니다.
4. 이미지 영역을 선택하고 업로드하는 방법은 아직 시범 단계이며 나중에 경험을 추가하겠습니다.