๐Ÿ–ฅ๏ธ DPR(device-pixel-ratio)

Aromahyangยท2022๋…„ 12์›” 19์ผ
0

Frontend

๋ชฉ๋ก ๋ณด๊ธฐ
3/5
post-thumbnail

DPR(device-pixel-ratio)

ํ˜„์žฌ ํ‘œ์‹œ ์žฅ์น˜์˜ ๋ฌผ๋ฆฌ์  ํ”ฝ์…€๊ณผ CSS ํ”ฝ์…€์˜ ๋น„์œจ(๋ฌผ๋ฆฌ์  ํ”ฝ์…€ / CSS ํ”ฝ์…€)์ด๋‹ค.
์ฆ‰, ํ•˜๋‚˜์˜ CSS ํ”ฝ์…€์— ๋ช‡ ๊ฐœ์˜ ๋ฌผ๋ฆฌ์  ํ”ฝ์…€์ด ํ•„์š”ํ•œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
๋ฌผ๋ฆฌ์  ํ”ฝ์…€(physical Pixel)๊ณผ CSS ํ”ฝ์…€(ํ˜น์€ logical pixel) ๋‘ ๊ฐ€์ง€ ํ”ฝ์…€์ด ๋“ฑ์žฅํ–ˆ๋‹ค.
๋ฌผ๋ฆฌ์  ํ”ฝ์…€์€ ๋‹จ๋ง๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ™”์†Œ(=ํ”ฝ์…€)์ด๋‹ค.
๋…ผ๋ฆฌ์  ํ”ฝ์…€์€ CSS์—์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ™”์†Œ์ด๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://abcdqbbq.tistory.com/47
์•„์ดํฐ 4์˜ ๊ฒฝ์šฐ window.devicePixelRatio๋Š” 2๊ฐ€ ๋œ๋‹ค.


์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://tomroth.com.au/dpr/
๋†’์€ ํ•ด์ƒ๋„์˜ ๊ธฐ๊ธฐ์ผ์ˆ˜๋ก, ๋†’์€ DPR์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
์ฆ‰, ํ•˜๋‚˜์˜ CSS ํ”ฝ์…€ ์•ˆ์— ๋งŽ์€ ๋ฌผ๋ฆฌ์  ํ”ฝ์…€์ด ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ ๋” ๊น”๋”ํ•˜๊ณ  ์„ ๋ช…ํ•œ ์ด๋ฏธ์ง€๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

canvas์™€ DPR

HTML์˜ canvas๋ฅผ ์ด์šฉํ•  ๋•Œ ํ…์ŠคํŠธ๊ฐ€ ํ๋ฆฟํ•˜๊ฒŒ(blurry) ๋ณด์ด๋Š” ํ˜„์ƒ์„ ์ข…์ข… ๋ชฉ๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งฅ๋ถ๊ณผ ๊ฐ™์€ Retina ๋””์Šคํ”Œ๋ ˆ์ด๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆด ๋•Œ ๋” ๋งŽ์€ ํ”ฝ์…€์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์ค€ ๋””์Šคํ”Œ๋ ˆ์ด์™€ Retina ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ ๋ Œ๋”๋ง ์ฐจ์ด๊ฐ€ ์ƒ๊ธด๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ DPR์ด ์œ ์šฉํ•˜๋‹ค.

๋จผ์ € canvas๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

<canvas width="40" height="30" />

40x30 ํ”ฝ์…€์˜ ์บ”๋ฒ„์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ™”๋ฉด์— ๋ณด์—ฌ์งˆ ์บ”๋ฒ„์Šค์˜ ๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด๋Š” CSS๋กœ๋„ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— 40x30 ํ”ฝ์…€๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  canvas์˜ ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•œ ๊ฐ€๋กœ, ์„ธ๋กœ ๊ธธ์ด๋Š” CSS ํ”ฝ์…€ ํ˜น์€ ๋ฌผ๋ฆฌ์  ํ”ฝ์…€๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
์ฆ‰, canvas์—์„œ ํ•˜๋‚˜์˜ ํ”ฝ์…€(์ดํ•˜ ์บ”๋ฒ„์Šค ํ”ฝ์…€)์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌผ๋ฆฌ์  ํ”ฝ์…€์„ ๋ฎ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌผ๋ฆฌ์ ์ธ ํ”ฝ์…€์„ ์ผ๋ถ€๋งŒ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๋‹ค.

DPR์„ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ์ ์œผ๋กœ ์„ ๋ช…ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

<!-- html -->
<canvas id="canvas" />
// javascript
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const WIDTH = 40;
const HEIGHT = 30;

// css ํ”ฝ์…€์— ๋งž์ถ”๊ธฐ
canvas.style.width = `${WIDTH}px`;
canvas.style.height = `${HEIGHT}px`;

// ๋ฌผ๋ฆฌ์  ํ”ฝ์…€์— ๋งž์ถ”๊ธฐ
const dpr = window.devicePixelRatio;
canvas.width = WIDTH * scale;
canvas.height = HEIGHT * scale;

// ์บ”๋ฒ„์Šค์˜ ์ขŒํ‘œ๊ณ„๋ฅผ DPR์— ๋งž์ถฐ ํ™•๋Œ€/์ถ•์†Œํ•˜๊ธฐ
context.scale(dpr, dpr);

canvas์˜ width, height ์†์„ฑ์— DPR์„ ๊ณฑํ•ด์ค˜์„œ ์บ”๋ฒ„์Šค ํ”ฝ์…€์ด ๋ฌผ๋ฆฌ์  ํ”ฝ์…€๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.
์บ”๋ฒ„์Šค ํ”ฝ์…€์ด dpr์— ๋งž์ถฐ ํ™•๋Œ€/์ถ•์†Œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— scale ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ขŒํ‘œ๊ณ„๋„ ํ™•๋Œ€/์ถ•์†Œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ 

[MDN]Window.devicePixelRatio
[CSS] DPR(Device-pixel-ratio)์˜ ์ดํ•ด
์›นํ•ด์ƒ๋„ (๋ฌผ๋ฆฌํ”ฝ์…€, ๋…ผ๋ฆฌํ”ฝ์…€, ๊ณ ๋ฐ€๋„ ํ•ด์ƒ๋„, PPI)
devicePixelContentBox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™„๋ฒฝํ•˜๊ฒŒ ํ”ฝ์…€(pixel-perfect) ๋ Œ๋”๋งํ•˜๊ธฐ

profile
ํ•œ ์šฐ๋ฌผ๋งŒ ํŒŒ๋Š” ์‚ฌ๋žŒ

0๊ฐœ์˜ ๋Œ“๊ธ€