Libvips: JPEG์— ํˆฌ๋ช…ํ•œ ๋ฐฐ๊ฒฝ์ด์žˆ๋Š” PNG ์‚ฝ์ž…-ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ ์–ป๊ธฐ

์— ๋งŒ๋“  2017๋…„ 10์›” 25์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: libvips/libvips

JPEG๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

tile

PNG๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

pin

JPEG์˜ ์œ„์น˜ 128x128.

ํ•  ๋•Œ

vips insert tile.jpg pin.png newimage.jpg 128 128

pin.jpg์—๋Š” ์•ŒํŒŒ ์ฑ„๋„์ด ์žˆ๊ณ  tile.jpg์—๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— Error Output: insert: images must have the same number of bands, or one must be single-band ๋ฅผ์ค๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ jpg๋ฅผ png๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

convert tile.jpg png32:tile.png    

์ด์ œ ์•ŒํŒŒ ์ฑ„๋„์ด์žˆ๋Š” tile.png๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
tile

ํ•˜์ง€๋งŒ ์ง€๊ธˆ ์ „ํ™”ํ•˜๋ฉด :

vips insert tile.png pin.png newimage.png 128 128

๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.
inserted

์‚ฝ์ž… ๋œ pin.png์˜ ๋ฐฐ๊ฒฝ์€ ํฐ์ƒ‰์ž…๋‹ˆ๋‹ค.

vips insert --help-all ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ๋ช…๋ น ์ค„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์ด๋ฏธ์ง€ ๋ชจ๋‘ ์•ŒํŒŒ ์ฑ„๋„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์งˆ๋ฌธ :

  • libvips insert ๋ช…๋ น์€ ํˆฌ๋ช…ํ•œ ๋ฐฐ๊ฒฝ์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?
  • ๊ทธ๋ ‡๋‹ค๋ฉด : ๋ˆ„๊ตฐ๊ฐ€์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ... ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

LG
์ฝ”๋“œ ์‹œ๋ฏผ

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํฐ ์ด๋ฏธ์ง€์— ๋งž๊ฒŒ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ํ™•๋Œ€ ํ•œ ๋‹ค์Œ ๋‹ค์Œ์„ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

width=$(vipsheader -f width background.jpg)
height=$(vipsheader -f height background.jpg)
vips embed marker.png overlay.png 128 128 $width $height
vips composite "background.jpg overlay.png" final.jpg 2

๋˜๋Š” ๋ฐฐ๊ฒฝ์˜ ์ผ๋ถ€๋ฅผ ์ž˜๋ผ ๋‚ด๊ณ  ๊ตฌ์„ฑํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค (์œ„์™€ ๊ฐ™์ด).

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœํ•˜๊ณ  ์‹ถ์€ ์ผ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, ์•„๋งˆ๋„ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @codecitizen ,

insert ์€ (๋Š”) ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€ ์œ„์— ๋†“๊ธฐ ๋งŒํ•˜๊ณ  ์–ด๋–ค ๋ธ”๋ Œ๋”ฉ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ libvips์—์„œ๋Š” blend ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ifthenelse ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฝค ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.

# get the alpha channel from the overlay
vips extract_band marker.png alpha.png 3 --n 1

# get RGB from the overlay
vips extract_band marker.png rgb.png 0 --n 3

# find the size of the overlay
width=$(vipsheader -f width marker.png)
height=$(vipsheader -f height marker.png)

# cut out an area the size of marker from the background
vips extract_area background.jpg bg.png 128 128 $width $height

# blend the marker on top of the chunk of background
vips ifthenelse alpha.png rgb.png bg.png blended.png --blend

# insert the blended image back into the background
vips insert background.jpg blended.png final.jpg 128 128 

์ด๊ฒƒ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด :

final

libvips 8.6์—๋Š” ๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ ๋ธ”๋ Œ๋”ฉ ๋ชจ๋“œ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฉ‹์ง„ ์ƒˆ composite ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„Œ ํ•  ์ˆ˜์žˆ์–ด:

vips composite "background.jpg marker.png" final.jpg 2

2 ๋Š” over ๋ธ”๋ Œ๋“œ ๋ชจ๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  PDF ํ˜ผํ•ฉ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ผ์ฃผ์ผ ์ •๋„๋ฉด ๋‚˜์˜ฌ ๊ฒ๋‹ˆ๋‹ค.

@jcupitt ์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. libvips 8.6์„ ์„ค์น˜ํ–ˆ๊ณ  vips composite ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฐ ์ด๋ฏธ์ง€์— ๋งž๊ฒŒ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ํ™•๋Œ€ ํ•œ ๋‹ค์Œ ๋‹ค์Œ์„ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

width=$(vipsheader -f width background.jpg)
height=$(vipsheader -f height background.jpg)
vips embed marker.png overlay.png 128 128 $width $height
vips composite "background.jpg overlay.png" final.jpg 2

๋˜๋Š” ๋ฐฐ๊ฒฝ์˜ ์ผ๋ถ€๋ฅผ ์ž˜๋ผ ๋‚ด๊ณ  ๊ตฌ์„ฑํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค (์œ„์™€ ๊ฐ™์ด).

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœํ•˜๊ณ  ์‹ถ์€ ์ผ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, ์•„๋งˆ๋„ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ฐ•! ๋น ๋ฅธ ๋„์›€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰