๐Ÿ“‚ PSD ํŒŒ์‹ฑํ•˜๋ฉด์„œ ๋งˆ์ฃผ์นœ ๋ฌธ์ œ๋“ค ์ •๋ฆฌ

JohnKimยท2025๋…„ 5์›” 20์ผ
0

javascript

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

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

์‹ค์ œ๋กœ ๋ถ€๋”ชํžˆ๋ฉด์„œ ์ •๋ฆฌํ•ด๋‘” ๋‚ด์šฉ์ด๋ผ, ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.


โœ… PSD ๋ ˆ์ด์–ด ๊ตฌ์กฐ: ํŠธ๋ฆฌ vs ํ”Œ๋žซ

๋ฌธ์ œ

PSD ํŒŒ์ผ์˜ ๋ ˆ์ด์–ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋ฆฌ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
๋ ˆ์ด์–ด ๊ทธ๋ฃน(group) ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ๋ ˆ์ด์–ด๋“ค์ด ๋“ค์–ด์žˆ๊ณ , ๋˜ ๊ทธ ์•ˆ์—๋„โ€ฆ ์ด๋Ÿฐ ์‹์ด์—์š”.
๊ทธ๋ž˜์„œ ๊ทธ๋ฃน ๋‚ด๋ถ€๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ๋ณดํ†ต ์žฌ๊ท€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ

@webtoon/psd ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” psdFile.layers๋ผ๋Š” ํ”Œ๋žซํ•œ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ํ•˜์œ„ ๋ ˆ์ด์–ด๊นŒ์ง€ ํฌํ•จ๋ผ ์žˆ๊ณ 
  • group๋„ ์ผ๋ฐ˜ ๋ ˆ์ด์–ด์ฒ˜๋Ÿผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์–ด์„œ
  • ๊ทธ๋ƒฅ for ๋ฌธ ํ•˜๋‚˜๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค
for (const layer of psdFile.layers) {
  // group ๋‚ด๋ถ€๊นŒ์ง€ ํฌํ•จํ•ด์„œ ์ „๋ถ€ ์ˆœํšŒ ๊ฐ€๋Šฅ
}

โš ๏ธ ์ด๋ฏธ์ง€ ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ์•ˆ ๋งž๋Š” ๋ฌธ์ œ

๋ฌธ์ œ

๋ณดํ†ต RGBA ๋ฒ„ํผ๋Š” width * height * 4 ๋ฐ”์ดํŠธ์—ฌ์•ผ ์ •์ƒ์ด์ฃ .
๊ทธ๋Ÿฐ๋ฐ ๊ฐ„ํ˜น ์ด ๊ธธ์ด๊ฐ€ ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ๋งˆ์Šคํฌ๊ฐ€ ์ ์šฉ๋œ ๋ ˆ์ด์–ด
  • ์••์ถ•๋œ ๋ฒ„ํผ
  • PSD ํฌ๋งท ์ฐจ์ด, ํ˜น์€ ํŒŒ์„œ ๋ฌธ์ œ

ํ•ด๊ฒฐ

์ผ๋‹จ ์บ”๋ฒ„์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๊นŒ์ง€๋งŒ ๋ณต์‚ฌํ•œ ๋’ค
๋ชจ์ž๋ผ๋Š” ๋ถ€๋ถ„์€ ํˆฌ๋ช…์œผ๋กœ ์ฑ„์›Œ์„œ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

const layerCanvas = document.createElement('canvas');
layerCanvas.width = layerWidth;
layerCanvas.height = layerHeight;
const ctx = layerCanvas.getContext('2d');

const imageData = ctx.createImageData(layerWidth, layerHeight);
const copyLen = Math.min(layerBuffer.length, imageData.data.length);

for (let i = 0; i < copyLen; i++) {
  imageData.data[i] = layerBuffer[i];
}

ctx.putImageData(imageData, 0, 0);
const dataURL = layerCanvas.toDataURL('image/png');

โœ๏ธ PSD ํ…์ŠคํŠธ ์Šคํƒ€์ผ โ†’ CSS๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

ํ…์ŠคํŠธ ์Šคํƒ€์ผ๋„ ์ƒ๊ฐ๋ณด๋‹ค ์‹ ๊ฒฝ ์“ธ ๊ฒŒ ๋งŽ์Šต๋‹ˆ๋‹ค.
PSD์—์„œ ๊บผ๋‚ธ ํ…์ŠคํŠธ๋ฅผ ์›น์— ๋งž๊ฒŒ CSS๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์ฐธ๊ณ ํ•œ ๋งคํ•‘ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.


font-size

  • ์œ„์น˜:
    StyleSheetData.FontSize (pt ๋‹จ์œ„)

  • ๋ณ€ํ™˜:

    • 1pt = 1.333px (96dpi ๊ธฐ์ค€)
    • TySh๊ฐ€ ์žˆ์œผ๋ฉด ๋ณ€ํ˜• ํ–‰๋ ฌ ๊ณ„์‚ฐ ํ•„์š”

line-height

  • ์œ„์น˜:
    StyleSheetData.Leading (pt)
  • ๋ณ€ํ™˜:
    lineHeightEm = (LeadingPt * 1.333) / fontSizePx

color

  • ์œ„์น˜:
    FillColor.Values โ†’ [R, G, B, A] (0~1 float)
  • ๋ณ€ํ™˜:
const rgba = values.map(v => Math.round(v * 255));
const cssColor = `rgba(${rgba[0]}, ${rgba[1]}, ${rgba[2]}, ${rgba[3] / 255})`;

font-family

  • ์œ„์น˜:

    • StyleSheetData.Font โ†’ ์ธ๋ฑ์Šค
    • ResourceDict.FontSet[n].Name โ†’ ์‹ค์ œ ํฐํŠธ๋ช…

font-weight / font-style

  • ์œ„์น˜:

    • FauxBold: true๋ฉด bold
    • FauxItalic: true๋ฉด italic

text-align

  • ์œ„์น˜:
    ParagraphSheet.Properties.Justification

  • ๊ฐ’:

    • 0: left
    • 1: right
    • 2: center
    • 3: justify

letter-spacing

  • ์œ„์น˜:
    StyleSheetData.Tracking (1/1000 em ๋‹จ์œ„)
  • ๋ณ€ํ™˜:
const letterSpacingPx = (Tracking / 1000) * fontSizePx;
const letterSpacingEm = letterSpacingPx / fontSizePx;

text-transform

  • ์œ„์น˜:
    FontCaps

  • ๊ฐ’:

    • 0: normal
    • 1: small-caps
    • 2: uppercase

๐Ÿ“Œ ์š”์•ฝํ‘œ

์Šคํƒ€์ผ ์†์„ฑPSD ์œ„์น˜๋ณ€ํ™˜ ๋ฐฉ์‹
font-sizeFontSize (pt)pt โ†’ px / TySh ์ ์šฉ
line-heightLeading (pt)pt โ†’ px โ†’ em
colorFillColor.Values0~1 float โ†’ rgba
font-familyFont + FontSet.NameํฐํŠธ ์ธ๋ฑ์Šค ๋งคํ•‘
font-weightFauxBoldtrue โ†’ bold
font-styleFauxItalictrue โ†’ italic
text-alignJustification0~3 โ†’ CSS ์ •๋ ฌ
letter-spacingTracking(Tracking / 1000) * fontSizePx
text-transformFontCaps0~2 โ†’ normal/small-caps/uppercase

๋งˆ๋ฌด๋ฆฌ

PSD ํŒŒ์‹ฑ์€ ๋‹จ์ˆœํžˆ ๋ ˆ์ด์–ด๋ฅผ ๋ฝ‘๋Š” ๊ฑธ ๋„˜์–ด์„œ,
ํŒŒ์ผ ๊ตฌ์กฐ๋‚˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๊นŒ์ง€ ๊ณ ๋ คํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ํ…์ŠคํŠธ ์Šคํƒ€์ผ ๋ณ€ํ™˜์ด๋‚˜ ์ด๋ฏธ์ง€ ๋ฒ„ํผ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ,
์ด์ƒํ•œ ์ผ€์ด์Šค๊ฐ€ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๋ถ€๋ถ„์€ ์ง์ ‘ ๊ฒช์–ด๋ด์•ผ ๊ฐ์ด ์žกํžˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

ํ•„์š”ํ•˜์‹  ๋ถ„๊ป˜ ๋„์›€ ๋์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ™‡
ํ˜น์‹œ ๊ถ๊ธˆํ•œ ์  ์žˆ์œผ๋ฉด ๋Œ“๊ธ€์ด๋‚˜ DM ์ฃผ์„ธ์š”!

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