๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/tech-resources

๋ธ”๋กœ๊ทธ ์ด๋ฏธ์ง€ ์„ ๋ช…๋„ ์ตœ์ ํ™”, ํ‹ฐ์Šคํ† ๋ฆฌ ์šด์˜์ž๋ฅผ ์œ„ํ•œ ์ด๋ฏธ์ง€ ์ปค์Šคํ…€ ๋ฆฌ์‚ฌ์ด์ง• ๋ฐฉ๋ฒ•

์ด๋ฏธ์ง€ ์„ ๋ช…๋„ ์ตœ์ ํ™”: image-rendering ์†์„ฑ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

์›น์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•˜๊ฑฐ๋‚˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋””์ž์ธํ•  ๋•Œ, ์ด๋ฏธ์ง€๊ฐ€ ์˜๋„์™€ ๋‹ฌ๋ฆฌ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ์—์„œ๋Š” ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ๋ฆฌ์‚ฌ์ด์ง• ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด ๊ณผ์ •์—์„œ ๋ถ€๋“œ๋Ÿฌ์šด ๊ณ„๋‹จ ํ˜„์ƒ(anti-aliasing)์ด ์ ์šฉ๋˜์–ด ์ด๋ฏธ์ง€๊ฐ€ ๋ฟŒ์˜‡๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‹ฐ์Šคํ† ๋ฆฌ ์ธ๋„ค์ผ ํ๋ฆผ ํ˜„์ƒ, ์ด๋ ‡๊ฒŒ ๊ฐœ์„ ํ•˜์„ธ์š”

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” image-rendering ์†์„ฑ์„ ํ†ตํ•ด ์ผ์ • ๋ถ€๋ถ„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ์ธ๋„ค์ผ, ์•„์ด์ฝ˜, ํ”ฝ์…€ ์•„ํŠธ ๋“ฑ์—์„œ ์‹œ๊ฐ์  ์„ ๋ช…๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

1. image-rendering ์†์„ฑ์˜ ๊ธฐ๋ณธ ์ดํ•ด

image-rendering์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง(ํ”ฝ์…€์„ ์กฐ์ •ํ•ด์„œ ๋ณด์—ฌ์ค„์ง€) ๊ฒฐ์ •ํ•˜๋Š” CSS ์†์„ฑ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋ฏธ์ง€ ํ™•๋Œ€ ์‹œ ์„ ๋ช…๋„ ์œ ์ง€์™€ ๋ถ€๋“œ๋Ÿฌ์šด ๋ณด๊ฐ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

1.1 ์ฃผ์š” ์†์„ฑ๊ฐ’ ์„ค๋ช…

์†์„ฑ๊ฐ’ ์„ค๋ช…
auto ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ (๊ธฐ๋ณธ๊ฐ’)
crisp-edges ๊ณ„๋‹จ ํ˜„์ƒ์„ ์œ ์ง€ํ•˜์—ฌ ์„ ๋ช…ํ•œ ๊ฒฝ๊ณ„ ์ œ๊ณต
pixelated ํ”ฝ์…€ ์•„ํŠธ ์Šคํƒ€์ผ ์œ ์ง€
-webkit-optimize-contrast ์›นํ‚ท ๊ณ„์—ด ๋ธŒ๋ผ์šฐ์ €(์‚ฌํŒŒ๋ฆฌ, ํฌ๋กฌ ๋“ฑ)์—์„œ ์„ ๋ช…๋„ ํ–ฅ์ƒ
.example-img {
  image-rendering: crisp-edges;              /* ํ‘œ์ค€ */
  image-rendering: -webkit-optimize-contrast; /* ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ (๋น„ํ‘œ์ค€) */
  image-rendering: -moz-crisp-edges;         /* ํŒŒ์ด์–ดํญ์Šค */
  -ms-interpolation-mode: nearest-neighbor;  /* IE ์ „์šฉ */
}

1.2 ์–ด๋–ค ์ƒํ™ฉ์— ํ•„์š”ํ•œ๊ฐ€?

  • ๋„ํŠธ ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„ ๊ทธ๋ž˜ํ”ฝ
  • ์ •๊ตํ•œ ์•„์ด์ฝ˜, ๋กœ๊ณ 
  • ์˜๋ฃŒ·์‚ฐ์—…์šฉ ๊ณ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€ ๋ทฐ์–ด
  • ์ง€๋„, ๋„ํ‘œ ๋“ฑ ์„ ๋ช…ํ•œ ๋ผ์ธ์ด ์ค‘์š”ํ•œ ์ฝ˜ํ…์ธ 

2. ์‹ค์ „ ์ ์šฉ ์‚ฌ๋ก€

์ด ์†์„ฑ์€ ๋‹ค์†Œ ๊ธฐ์ˆ ์ ์ธ ์„ฑ๊ฒฉ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด, ์ผ๋ฐ˜ ๋ธ”๋กœ๊ทธ ์šด์˜์ž ์ž…์žฅ์—์„œ ๋ชจ๋“  ์„ธ๋ถ€ ๋‚ด์šฉ์„ ์ˆ™์ง€ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋ธ”๋กœ๊ทธ ๋ฐฉ๋ฌธ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋˜๋ ทํ•˜๊ฒŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ

ํŠนํžˆ ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ๋ฅผ ํฌํ•จํ•œ CMS ํ™˜๊ฒฝ์—์„œ๋Š”, ์ด๋ฏธ์ง€ ์„ ๋ช…๋„ ์ตœ์ ํ™”๊ฐ€ ๋‹จ์ˆœํžˆ ์‹œ๊ฐ์  ๋งŒ์กฑ๋„๋ฅผ ๋„˜์–ด SEO(๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”)์—๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ์™€ ๋Œ€์‘ ๋ฐฉ์•ˆ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

2.1 ์ธ๋„ค์ผ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

๋ธ”๋กœ๊ทธ ๋ณธ๋ฌธ์— ์‚ฝ์ž…๋œ ์ด๋ฏธ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ž๋™ ์กฐ์ •๋˜๋ฉฐ, ์ผ๋ฐ˜ ์ฝ˜ํ…์ธ ์—๋Š” ํฌ๊ฒŒ ๋ถˆํŽธํ•จ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ๋„ค์ผ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ, ํ•ด์ƒ๋„์™€ ๋น„์œจ, ์„ ๋ช…๋„ ์ธก๋ฉด์—์„œ ๋ถ€์กฑํ•จ์„ ๋А๋ผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ธ๋„ค์ผ์€ ์ฝ˜ํ…์ธ ์˜ ์ฒซ์ธ์ƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ์š”์†Œ์ด์ž ํด๋ฆญ ์œ ๋„์œจ(CTR)์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ„๋„์˜ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2.2 ์ธ๋„ค์ผ ๊ตฌ์กฐ ์˜ˆ์‹œ

<div class="gallery">
  <img src="product.webp" 
       class="optimized-thumb" 
       width="400" 
       height="300" 
       alt="์ œํ’ˆ ์ธ๋„ค์ผ">
</div>

<style>
.optimized-thumb {
  width: 100%;
  height: auto;
  image-rendering: crisp-edges;
  object-fit: contain;
  border: 1px solid #f0f0f0;
  transition: transform 0.3s ease;
}

.optimized-thumb:hover {
  transform: scale(1.03);
  filter: contrast(1.1);
}
</style>
  • ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํ•ด์ƒ๋„ ์ง€์›
    ์Šค๋งˆํŠธํฐ, ํƒœ๋ธ”๋ฆฟ, ๊ณ ํ•ด์ƒ๋„ ๋…ธํŠธ๋ถ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•ด์ƒ๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๋” ์„ ๋ช…ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์†๋„์™€ ํ’ˆ์งˆ์˜ ๊ท ํ˜•
    ์ผ๋ฐ˜ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋งŒ ์“ฐ๋ฉด ๊ณ ํ•ด์ƒ๋„ ๊ธฐ๊ธฐ์—์„œ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ด๊ณ , ๋ฌด์กฐ๊ฑด ํฐ ์ด๋ฏธ์ง€๋งŒ ์“ฐ๋ฉด ๋А๋ฆฐ ๋„คํŠธ์›Œํฌ์—์„œ ๋กœ๋”ฉ์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ src์™€ srcset์„ ๊ฐ™์ด ์จ์„œ ์ผ๋ฐ˜ ๊ธฐ๊ธฐ์—๋Š” ๊ฐ€๋ฒผ์šด ์ธ๋„ค์ผ ๋ถˆ๋Ÿฌ์ฃผ๊ณ  ๊ณ ํ•ด์ƒ๋„ ๊ธฐ๊ธฐ์—๋Š” ์„ ๋ช…ํ•œ ํฐ ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

2.3 ํ‹ฐ์Šคํ† ๋ฆฌ ์ธ๋„ค์ผ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

ํ‹ฐ์Šคํ† ๋ฆฌ๋Š” ์ด๋ฏธ์ง€ ์น˜ํ™˜์ž({์ด๋ฏธ์ง€}) ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ๋„ค์ผ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋ฉฐ, ์ผ๋ถ€ ์Šคํ‚จ์—์„œ๋Š” ๊ณ ์ •๋œ ํ•ด์ƒ๋„(์˜ˆ: 300x200, 400x300)๋กœ ๋ฆฌ์‚ฌ์ด์ง•๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์›๋ณธ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์ด ์†์‹ค๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, CSS๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

์›๋ณธ ์ฝ”๋“œ

src="//i1.daumcdn.net/thumb/C58x58.fwebp.q85/?fname=" alt=""

์ˆ˜์ •ํ•œ ์ฝ”๋“œ

src="//i1.daumcdn.net/thumb/C600x336.fwebp.q85/?fname=" alt=""

ํ‹ฐ์Šคํ† ๋ฆฌ ์ธ๋„ค์ž„ ์ด๋ฏธ์ง€ ์„ ๋ช…ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•

2.4 ๊ณ ํ•ด์ƒ๋„(๋ ˆํ‹ฐ๋‚˜) ๋””์Šคํ”Œ๋ ˆ์ด ๋Œ€์‘

๊ณ ํ•ด์ƒ๋„ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ๋Š” ์ผ๋ฐ˜ ํ•ด์ƒ๋„์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฟŒ์˜‡๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ์‹์€ 2๋ฐฐ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)

  • ์ด ๋ถ€๋ถ„์€ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.
  • -webkit-min-device-pixel-ratio: 2๋Š” ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ ๊ฐ™์€ ์›นํ‚ท ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™”๋ฉด ํ”ฝ์…€ ๋ฐฐ์œจ์ด 2๋ฐฐ ์ด์ƒ์ธ ๊ณ ํ•ด์ƒ๋„ ๊ธฐ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • min-resolution: 192dpi๋Š” ํ‘œ์ค€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด์ƒ๋„๊ฐ€ 192dpi ์ด์ƒ์ธ ๊ณ ํ•ด์ƒ๋„ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•  ๋•Œ๋งŒ {} ์•ˆ์˜ ์Šคํƒ€์ผ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. .high-dpi-img

  • ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ, ๊ณ ํ•ด์ƒ๋„ ํ™”๋ฉด์—์„œ ์Šคํƒ€์ผ์ด ์ ์šฉ๋  ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

3. background-image: url('image@2x.jpg');

  • ๊ณ ํ•ด์ƒ๋„ ์ „์šฉ 2๋ฐฐ ํฌ๊ธฐ ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณดํ†ต ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ 2๋ฐฐ์—ฌ์„œ, ๊ณ ํ•ด์ƒ๋„ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ๋” ์„ ๋ช…ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

4. image-rendering: crisp-edges;

  • ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€์„ ๋‚ ์นด๋กญ๊ณ  ์„ ๋ช…ํ•˜๊ฒŒ ๋ Œ๋”๋งํ•˜๋„๋ก ํ•˜๋Š” CSS ์†์„ฑ์ž…๋‹ˆ๋‹ค.
  • ํ”ฝ์…€ ์•„ํŠธ, ์•„์ด์ฝ˜ ๋“ฑ ์„ ๋ช…ํ•จ์ด ์ค‘์š”ํ•œ ์ด๋ฏธ์ง€์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
@media (-webkit-min-device-pixel-ratio: 2), 
       (min-resolution: 192dpi) {
  .high-dpi-img {
    background-image: url('image@2x.jpg');
    image-rendering: crisp-edges;
  }
}
  • ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํ•ด์ƒ๋„ ์ง€์›
    ์Šค๋งˆํŠธํฐ, ํƒœ๋ธ”๋ฆฟ, ๊ณ ํ•ด์ƒ๋„ ๋…ธํŠธ๋ถ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•ด์ƒ๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๋” ์„ ๋ช…ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์†๋„์™€ ํ’ˆ์งˆ์˜ ๊ท ํ˜•
    ์ผ๋ฐ˜ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋งŒ ์“ฐ๋ฉด ๊ณ ํ•ด์ƒ๋„ ๊ธฐ๊ธฐ์—์„œ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ด๊ณ , ๋ฌด์กฐ๊ฑด ํฐ ์ด๋ฏธ์ง€๋งŒ ์“ฐ๋ฉด ๋А๋ฆฐ ๋„คํŠธ์›Œํฌ์—์„œ ๋กœ๋”ฉ์ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ src์™€ srcset์„ ๊ฐ™์ด ์จ์„œ ์ผ๋ฐ˜ ๊ธฐ๊ธฐ์—๋Š” ๊ฐ€๋ฒผ์šด ์ธ๋„ค์ผ ๋ถˆ๋Ÿฌ์ฃผ๊ณ  ๊ณ ํ•ด์ƒ๋„ ๊ธฐ๊ธฐ์—๋Š” ์„ ๋ช…ํ•œ ํฐ ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

3. ์„ฑ๋Šฅ ๋น„๊ต ๋ฐ ์ตœ์ ํ™” ํŒ

3.1 ๋ Œ๋”๋ง ๋ฐฉ์‹ ๋น„๊ตํ‘œ

์•„๋ž˜๋Š” CSS image-rendering ์†์„ฑ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ Œ๋”๋ง ๋ฐฉ์‹ 3๊ฐ€์ง€์— ๋Œ€ํ•œ ์„ ๋ช…๋„, ์„ฑ๋Šฅ, ํ™œ์šฉ ์‚ฌ๋ก€ ๋น„๊ตํ‘œ์ž…๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ๋ฐฉ์‹ ์„ ๋ช…๋„ ์„ฑ๋Šฅ ์‚ฌ๋ก€
๊ธฐ๋ณธ ๋ฆฌ์‚ฌ์ด์ง• โ–ณ โ˜…โ˜…โ˜… ์ผ๋ฐ˜ ์‚ฌ์ง„
crisp-edges โ˜…โ˜…โ˜… โ˜…โ˜… ์•„์ด์ฝ˜, ๋กœ๊ณ 
pixelated โ˜…โ˜… โ˜…โ˜…โ˜… ๋„ํŠธ ๊ทธ๋ž˜ํ”ฝ
  • ๊ธฐ๋ณธ ๋ฆฌ์‚ฌ์ด์ง•(auto): ๋ถ€๋“œ๋Ÿฌ์šด ํ™•๋Œ€ ์ถ•์†Œ์— ์ ํ•ฉ. ์ผ๋ฐ˜์ ์ธ ์ด๋ฏธ์ง€์— ์‚ฌ์šฉ.
  • crisp-edges: ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๋‚ ์นด๋กญ๊ฒŒ ๋ Œ๋”๋ง. ํ”ฝ์…€ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๊ณ ์ •๋œ ํ”ฝ์…€ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€์— ์ ํ•ฉ.
  • pixelated: ํ”ฝ์…€์„ ์˜๋„์ ์œผ๋กœ ํฌ๊ฒŒ ํ™•๋Œ€ํ•ด ๋ ˆํŠธ๋กœํ•œ ๋А๋‚Œ. ๋„ํŠธ ์Šคํƒ€์ผ ๊ฒŒ์ž„ ๊ทธ๋ž˜ํ”ฝ์— ์ด์ƒ์ .

3.2 ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋‹จ๊ณ„๋ณ„ ํŒ

  1. ์›๋ณธ ํ•ด์ƒ๋„ ํ™•๋ณด:
    ํ‘œ์‹œ ํฌ๊ธฐ์˜ 2๋ฐฐ ์ด์ƒ ํ•ด์ƒ๋„๋กœ ์ œ์ž‘
  2. ํฌ๋งท ์„ ํƒ:
    WebP > PNG > JPEG ์ˆœ์œผ๋กœ ๊ณ ๋ ค
  3. CSS ์„ค์ •:
    image-rendering, object-fit ๋“ฑ ์†์„ฑ ์กฐํ•ฉ
  4. ์„ฑ๋Šฅ ์ ๊ฒ€:
    Chrome DevTools, Lighthouse ๋“ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ

4. ๊ณ ๊ธ‰ ํ™œ์šฉ ํ…Œํฌ๋‹‰

4.1 Canvas ์ด๋ฏธ์ง€ ํ’ˆ์งˆ ์„ค์ •

HTML5์˜ <canvas> ์š”์†Œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ž˜ํ”ฝ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋ฏธ์ง€๋ฅผ ํ™•๋Œ€ํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•  ๋•Œ ํ’ˆ์งˆ ์„ค์ •์ด ์ค‘์š”ํ•œ๋ฐ, ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด imageSmoothingEnabled ์†์„ฑ์ž…๋‹ˆ๋‹ค.

  • imageSmoothingEnabled ์†์„ฑ์€ ์บ”๋ฒ„์Šค์—์„œ ์ด๋ฏธ์ง€ ํ™•๋Œ€/์ถ•์†Œ ์‹œ ํ”ฝ์…€ ๋ณด๊ฐ„(๋ธ”๋Ÿฌ) ํšจ๊ณผ๋ฅผ ์ผœ๊ฑฐ๋‚˜ ๋„๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
  • false๋กœ ์„ค์ •ํ•˜๋ฉด ํ”ฝ์…€ ๋‹จ์œ„๊ฐ€ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด, ๋„ํŠธ ๊ทธ๋ž˜ํ”ฝ์ด๋‚˜ ํ”ฝ์…€ ์•„ํŠธ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ ์œ„ํ•ด WebKit(ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ), Mozilla(ํŒŒ์ด์–ดํญ์Šค) ์ „์šฉ ์ ‘๋‘์‚ฌ ์†์„ฑ๋„ ๊ฐ™์ด ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

ctx.imageSmoothingEnabled = false;
ctx.webkitImageSmoothingEnabled = false;  // ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ์šฉ
ctx.mozImageSmoothingEnabled = false;     // ํŒŒ์ด์–ดํญ์Šค์šฉ

4.2 ์–ธ์ œ false๋กœ ์„ค์ •ํ•˜๋‚˜์š”?

  • ๋„ํŠธ ๊ทธ๋ž˜ํ”ฝ, ํ”ฝ์…€ ์•„ํŠธ, ๋ ˆํŠธ๋กœ ๊ฒŒ์ž„ ์Šคํƒ€์ผ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๊ฐ ํ”ฝ์…€์˜ ์„ ๋ช…ํ•œ ๊ฒฝ๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
  • ํ™•๋Œ€ํ•ด๋„ ํ”ฝ์…€์ด ๊นจ๋—ํ•˜๊ณ  ์„ ๋ช…ํ•˜๊ฒŒ ๋ณด์—ฌ์•ผ ํ•  ๋•Œ
  • ๊ทธ๋ž˜ํ”ฝ์ด ๋ญ‰๊ฐœ์ ธ ๋ณด์ด์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

4.3 SVG ํ•„ํ„ฐ ๊ฒฐํ•ฉ ์˜ˆ์‹œ

  • <feGaussianBlur>: ์›๋ณธ ๊ทธ๋ž˜ํ”ฝ์„ ํ๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • <feComponentTransfer>: ํ๋ ค์ง„ ์ด๋ฏธ์ง€ ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.
  • <feDropShadow>: ๊ทธ๋ฆผ์ž ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • result ์†์„ฑ์„ ์ด์šฉํ•ด ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฆ„ ๋ถ™์—ฌ ๋‹ค์Œ ํ•„ํ„ฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ <feDropShadow>๋Š” ๋ฐ”๋กœ ์›๋ณธ ๊ทธ๋ž˜ํ”ฝ์— ์ ์šฉ๋˜๋ฉฐ, ํ•„์š”ํ•˜๋ฉด in ์†์„ฑ์œผ๋กœ ์ด์ „ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  <svg width="0" height="0" style="position:absolute; visibility:hidden;">
    <defs>
      <filter id="combinedFilter" x="-20%" y="-20%" width="140%" height="140%">
        <!-- 1. ํ๋ฆผ ํšจ๊ณผ -->
        <feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blurred"/>
        
        <!-- 2. ๋ฐ๊ธฐ ์กฐ์ ˆ -->
        <feComponentTransfer in="blurred" result="brightened">
          <feFuncR type="linear" slope="1.2" intercept="0"/>
          <feFuncG type="linear" slope="1.2" intercept="0"/>
          <feFuncB type="linear" slope="1.2" intercept="0"/>
        </feComponentTransfer>
        
        <!-- 3. ๊ทธ๋ฆผ์ž ํšจ๊ณผ -->
        <feDropShadow dx="4" dy="4" stdDeviation="2" flood-color="rgba(0,0,0,0.5)" />
      </filter>
    </defs>
  </svg>

5. ์ฃผ์˜์‚ฌํ•ญ ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ

5.1 ํ”ํ•œ ์‹ค์ˆ˜

  • ๋‚ฎ์€ ์›๋ณธ ํ•ด์ƒ๋„: CSS๋งŒ์œผ๋กœ ํ•ด๊ฒฐ ๋ถˆ๊ฐ€
  • ์†์„ฑ ์ถฉ๋Œ: transform๊ณผ filter ์ค‘๋ณต ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ
  • ํ•„ํ„ฐ ๊ณผ๋‹ค ์‚ฌ์šฉ: ๋ Œ๋”๋ง ์†๋„ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ

5.2 ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ๋Œ€์‘

.img-optimized {
  image-rendering: crisp-edges;
  image-rendering: -webkit-optimize-contrast;
  image-rendering: -moz-crisp-edges;
  -ms-interpolation-mode: nearest-neighbor;
}
์†์„ฑ ์„ค๋ช… ๋Œ€์ƒ ๋ธŒ๋ผ์šฐ์ €
image-rendering: crisp-edges; ์ด๋ฏธ์ง€ ํ™•๋Œ€ ์‹œ, ํ๋ฆฌ์ง€ ์•Š๊ณ  ์„ ๋ช…ํ•˜๊ฒŒ(ํ”ฝ์…€ ์œ ์ง€) ํ‘œ์‹œ ํ‘œ์ค€ ๋ธŒ๋ผ์šฐ์ €
image-rendering: -webkit-optimize-contrast; ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ์—์„œ ๋Œ€๋น„๋ฅผ ์œ ์ง€ํ•œ ๊ณ ํ™”์งˆ ๋ Œ๋”๋ง (๋น„ํ‘œ์ค€) WebKit ๊ณ„์—ด (Chrome, Safari)
image-rendering: -moz-crisp-edges; ํŒŒ์ด์–ดํญ์Šค ์ „์šฉ ํ”ฝ์…€ ์„ ๋ช…๋„ ์œ ์ง€ ์˜ต์…˜ Firefox
-ms-interpolation-mode: nearest-neighbor; IE ์ „์šฉ ์ด๋ฏธ์ง€ ํ™•๋Œ€ ์‹œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ”ฝ์…€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ Internet Explorer

์˜ˆ์‹œ:

<img src="low-res-image.png" class="img-optimized" width="400" height="400" />

์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์ถ”์ฒœ๋ฐฉ์‹

/* ๊ธฐ๋ณธ ์Šคํƒ€์ผ (์ „ ์ด๋ฏธ์ง€์— ๋ฌดํ•ดํ•œ ํšจ๊ณผ) */
img {
  width: 100%;
  border-radius: 8px;
  border: 1px solid rgba(0, 0, 0, 0.05);
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
}

/* ๊ณ ๊ธ‰ ์ด๋ฏธ์ง€ ํšจ๊ณผ (ํ•„์š”ํ•œ ๊ณณ์—์„œ๋งŒ) */
.img-enhanced {
  filter: contrast(1.08) brightness(1.02) saturate(1.05);
  -webkit-filter: contrast(1.08) brightness(1.02) saturate(1.05);
  will-change: transform, opacity;
  transform: translateZ(0);
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

/* ๋„ํŠธ ์ด๋ฏธ์ง€์šฉ ๋ Œ๋”๋ง ์ตœ์ ํ™” */
.img-crisp {
  image-rendering: crisp-edges;
  image-rendering: -webkit-optimize-contrast;
  image-rendering: -moz-crisp-edges;
  -ms-interpolation-mode: nearest-neighbor;
}

์ด๋ฏธ์ง€ ์„ ๋ช…๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ ์ „๋žต์€?

์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋Š” ๋‹จ์ˆœํžˆ CSS ์†์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข…ํ•ฉ์  ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ๊ณ ํ’ˆ์งˆ ์›๋ณธ ํ™•๋ณด
  • ์ ์ ˆํ•œ ์ด๋ฏธ์ง€ ํฌ๋งท ์„ ํƒ
  • ์ƒํ™ฉ์— ๋งž๋Š” image-rendering ์†์„ฑ ์ ์šฉ
  • ๊ณ ํ•ด์ƒ๋„ ๋Œ€์‘ ๋ฐ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋ณ‘ํ–‰

์ด๋ฏธ์ง€๊ฐ€ ๋˜๋ ทํ•˜๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ธ”๋กœ๊ทธ์˜ ์ „๋ฌธ์„ฑ๊ณผ ์‹ ๋ขฐ๋„๊ฐ€ ์ƒ์Šนํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'IT > tech-resources' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ธ”๋กœ๊ทธ์— ๊ฐ์„ฑ์„ ๋”ํ•˜๋‹ค โ€“ Vocaroo ์ž๋™ ์žฌ์ƒ ์Œ์•… ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•  (3) 2025.06.24
๋ธ”๋กœ๊ทธ ์นดํ…Œ๊ณ ๋ฆฌ ํŽ˜์ด์ง€ ์„ธ๋ จ๋œ ๋””์ž์ธ ๋ชจ์Œ: 4๊ฐ€์ง€ ์Šคํƒ€์ผ๊ณผ HTML ์ฝ”๋“œ ์˜ˆ์‹œ  (8) 2025.06.23
ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธ€์“ฐ๊ธฐ ์—๋””ํ„ฐ ๊ฐ€๋กœํญ ์กฐ์ ˆ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€์™€ ๊ฐ„๋‹จ ์—๋””ํ„ฐ ํ”„๋กœ๊ทธ๋žจ  (3) 2025.06.22
๋™์  ๋งํฌ ๋ฒ„ํŠผ,๋ธ”๋กœ๊ทธ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋งž์ถค ๋ฒ„ํŠผ ์ž๋™ ์ƒ์„ฑํ•˜๊ธฐ ,์ด์œ ๋ฒ„ํŠผ๋ชจ์Œ  (4) 2025.06.20
๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ๋ณ€ํ™˜๊ธฐ ์‚ฌ์šฉํ•ด์„œ ๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ  ์ •๋ฆฌ ํ•˜๊ธฐ ,์ฃผ์ œ๋ณ„ ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ  (0) 2025.06.20
SoundCloud, AI ๊ฒ€์ƒ‰ ์‹œ๋Œ€, ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋ธ”๋กœ๊ทธ ๋งŒ๋“œ๋Š” ๋ฒ• โ€“ ์Œ์•…์œผ๋กœ ์‚ฌ์šฉ์ž์™€ ๊ต๊ฐํ•˜๊ธฐ  (4) 2025.06.16
๋ฐ”ํ† ์„ธ๋ผ ๊ฒŒ์ž„ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฐ€์ด๋“œ โ€“ BIOS ์„ค์ •๋ถ€ํ„ฐ ROM ์ถ”๊ฐ€๊นŒ์ง€ ํ•œ๋ฐฉ์—!  (2) 2025.06.07