웹 페이지 성능 향상 방법 중 하나인 이미지 최적화.
웹에서 자주 사용되어지는 이미지에 대해 알아보고, 최적화 원리와 방식에 대해 알아보자.
이미지 파일 형식은 디지털 이미지를 구성하고 저장하는 표준적인 방법을 의미한다.
따라서, 이미지 파일은 모니터나 프린터로 레스터화할 수 있는 데이터의 모음이라고 생각하면 된다.
래스터화(Rasterization)란, 벡터 그래픽으로 설명된 이미지를 래스터이미지(=비트맵이미지)로 변환하는 작업.
이미지(데이터의 모음)는 일반적으로 아래와 같은 포맷으로 저장할 수 있다.
2가지 포맷으로 되어 있는 많은 이미지 파일들이 있지만, 웹에서 흔히 사용되어지는 이미지 파일 타입들에 대해서만 알아보자.
type | File format | MIME type | File extension(s) | Summary |
---|---|---|---|---|
GIF | Graphics Interchange Format | image/gif | .gif | 래스터 포맷, 무손실 압축 8비트 256색상과 단일 투명색 지원 여러 프레임을 데이터로 가질 수 있음(애니메이션 가능) |
JPEG | Joint Photographic Expert Group image | image/jpeg | .jpg, .jpeg, .jfif, .pjpeg, .pjp | 래스터 포맷, 손실 압축 압축률이 높을 경우, 이미지 손실 발생 동일한 이미지를 여러번 편집/저장시 점점 퀄리티 저하 가장 많이 사용되는 포맷 |
PNG | Portable Network Graphics | image/png | .png | 래스터 포맷, 무손실 압축 GIF를 대체하기 위해 만들어짐 8비트(투명도 옵션 존재), 24비트 트루컬러(1600만 색), 48비트 트루컬러, 알파채널(옵셔널) 지원 애니메이션은 APNG 포맷으로 가능 |
SVG | Scalable Vector Graphics | image/svg+xml | .svg | 벡터 포맷 xml 형식으로 데이터 저장. |
MDN에서는 몇가지의 타입(WebP, AVIF, APNG)에 대해 더 설명해 주고 있지만, 이 글에서는 브라우저 호환성을 고려하여(IE..) 작성하였다.
이미지는 대체로 웹 페이지의 HTML, CSS, Javascript 등의 리소스보다 많은 바이트를 필요로 한다.
가장 좋은 최적화 전략은 이미지를 대체할 수 있는 방식(ex. css 표현, 웹폰트 사용 등)를 활용하여 사용자에게 컨텐츠를 전달하는 것이겠지만 이미지 또한 좋은 표현 수단이므로
올바른 포맷을 선택하는 기준, 최적화를 하는 방식/방법에 대해 알아보자.
포맷을 선택하는데에 있어, 정답은 없지만, 최선의 노력은 존재한다.
로고, 텍스트, 아이콘과 같은 기하학적인 모양으로 구성된 이미지
또한, 해상도 및 배율에 독립적이므로 다양한 크기로 표현해야하는 경우에도 좋다.
이미지가 복잡하여 svg 마크업 양이 많아지는 경우에는 사용하면 좋지 않다.
최적화
removeDoctype
removeXMLProcInst
removeComments
removeMetadata
removeEditorsNSData
cleanupAttrs
mergeStyles
inlineStyles
minifyStyles
cleanupIDs
removeUselessDefs
cleanupNumericValues
convertColors
removeUnknownsAndDefaults
removeNonInheritableGroupAttrs
removeUselessStrokeAndFill
removeViewBox
cleanupEnableBackground
removeHiddenElems
removeEmptyText
convertShapeToPath
convertEllipseToCircle
moveElemsAttrsToGroup
moveGroupAttrsToElems
collapseGroups
convertPathData
convertTransform
removeEmptyAttrs
removeEmptyContainers
mergePaths
removeUnusedNS
sortDefsChildren
removeTitle
removeDesc
간단한 도형, 로고, 만화 그림처럼 색이 별로 필요 없는 이미지와 애니메이션을 표현하고자 할 때
애니메이션 표현시 loop, delay에 대한 설정이 이미지 내에 저장되기 때문에 여러 환경에서 편리하게 사용할 수 있다.
무손실 압축을 하기 때문에 프레임이 많아지면 용량도 매우 비대해지므로, 이럴 땐 다른 방식을 활용하는게 좋다.
웹 페이지가 모던 브라우저만 지원해도 된다면, APNG
, AVIF
를 사용하는게 훨씬 좋을 수 있다.
(avif는 edge와 safari에서는 지원되지 않는다..)
최적화
gif를 최적화를 할 수 있는 방법은.. 해상도 줄이기, 사용 색상 줄이기, 애니메이션 프레임 줄이기와 같은 원초적인 행위 밖에 없는데,
이는 이미지의 표현을 의도한대로 사용자에게 전달할 수 있는 방법이 아니다.
사진과 같이 복잡한 패턴과 색상을 갖는 이미지
웹 페이지 전체를 뒤덮는 배경 이미지
PC 웹의 배경 이미지는 대부분 고해상도로 되어 있는데 어느정도 이미지 손실을 감안하더라도 성능을 위해 jpeg를 사용하는 것이 좋다.
고주파 성분이 많은 문자, 선, 격자 등 단색이나 뚜렷한 윤곽선을 가지는 이미지에서는 품질 저하(뭉개짐, 노이즈)가 다소 뚜렷하게
보이는 현상이 있다. 이러한 이미지는 PNG와 같은 다른 형식을 사용하자.
주파수는 전자기파의 주파수를 말하는 것이 아니라, 데이터를 격자 상에 늘어 놓았을 때의 공간적인 변화를 말하는 것
최적화
예시
위의 최적화 방법이 적용된 tinyjpg를 통한 비교예시
orginal | compressed | |
---|---|---|
Image | ||
Size | 614KB | 162KB |
출처 | https://tinyjpg.com/ |
문자, 선, 격자 등 단색이나 뚜렷한 윤곽선을 가지는 이미지
알파 채널을 표현해야되는 이미지
무손실 압축을 하기 때문에 웹상에서 이미지가 추가적으로 편집/저장될 가능성이 있을 경우에 사용해도 좋다.
애니메이션을 표현해야 한다면 확장 포맷인 APNG 형식을 사용할 수도 있다.
이미지에 사용되어지는 색상이 많을 경우, png의 용량이 비대해질 수 있으므로 다른 형식을 사용하자.
최적화
color depth
(색 심도)를 8-bit indexed color로 설정.예시
위의 최적화 방법이 적용된 tinypng를 통한 비교예시
orginal | compressed | |
---|---|---|
Image | ||
Size | 57KB | 15KB |
출처 | https://tinypng.com/ |
color depth
(색 심도)에 따른 비교예시
24 bit | 8 bit | |
---|---|---|
Image | ||
Size | 98KB | 37KB(-62%) |
출처 | https://en.wikipedia.org/wiki/Color_depth |
srcSet
, sizes
속성을 통하여 반응형 이미지 제공.