업로드 전 이미지 읽기 파이프라인

업로드 전 이미지 읽기 파이프라인 A workflow diagram generated by Archify. 01 / 입력 · 출력 02 / 읽기 단계 EX / 단계를 건너뛰면 크기 확인 축소 디코드 보정 · 압축 원본 픽셀을 힙에 올리지 않는 구간 이미지 주소 · 사용자가 고른 파일 · 입력 · 출력 › 크기 확인 이미지 주소 사용자가 고른 파일 업로드용 바이트 · 수 백 KB · 입력 · 출력 › 보정 · 압축 업로드용 바이트 수 백 KB 크기만 읽기 · 픽셀은 올리지 않음 · 읽기 단계 › 원본 픽셀을 힙에 올리지 않는 구간 › 크기 확인 크기만 읽기 픽셀은 올리지 않음 축소 배수 계산 · 긴 변 1920px 이하 · 읽기 단계 › 원본 픽셀을 힙에 올리지 않는 구간 › 축소 디코드 축소 배수 계산 긴 변 1920px 이하 축소해서 디코드 · 작은 이미지만 메모리에 · 읽기 단계 › 원본 픽셀을 힙에 올리지 않는 구간 › 축소 디코드 · 1/16 픽셀 축소해서 디코드 작은 이미지만 메모리에 1/16 픽셀 방향 보정 · 회전 · 반전 적용 · 읽기 단계 › 보정 · 압축 방향 보정 회전 · 반전 적용 JPEG 압축 · 품질 85 · 메모리 반환 · 읽기 단계 › 보정 · 압축 JPEG 압축 품질 85 · 메모리 반환 메모리 초과 · 원본 전체를 힙에 적재 · 단계를 건너뛰면 › 크기 확인 메모리 초과 원본 전체를 힙에 적재 사진이 누움 · 방향 태그를 무시 · 단계를 건너뛰면 › 보정 · 압축 사진이 누움 방향 태그를 무시 스트림 열기 보정을 빼면 통째로 읽으면 축소 배수 전송 가로 · 세로 Legend User UI Agent logic Policy Context / trace Cloud service External system

파일 크기와 메모리는 다르다

  • • 디코드된 이미지는 가로 × 세로 × 4바이트를 쓴다
  • • 4000×3000 사진은 파일이 4MB여도 메모리는 48MB다
  • • 저사양 기기는 이 한 장으로 죽는다

작게 만들어서 올린다

  • • 크기를 먼저 읽고 축소 배수를 정한다
  • • 축소는 디코드 시점에 일어난다
  • • 큰 것을 만든 뒤 줄이는 것이 아니다

픽셀을 다시 그리면 책임도 넘어온다

  • • 원본을 그대로 보낼 때는 방향 태그를 서버가 해석했다
  • • 직접 디코드하면 회전을 직접 적용해야 한다
  • • 다 쓴 이미지는 명시적으로 메모리를 돌려준다