Libvips: Вставка PNG с прозрачным фоном в JPEG - Получение белого фона

Созданный на 25 окт. 2017  ·  4Комментарии  ·  Источник: libvips/libvips

У меня есть JPEG:

tile

Я хочу вставить PNG:

pin

В позиции 128x128 в формате JPEG.

Когда делаешь

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

Это дает мне Error Output: insert: images must have the same number of bands, or one must be single-band поскольку у pin.jpg есть альфа-канал, а у tile.jpg нет.

Итак, я конвертирую 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 вам нужно использовать ifthenelse с опцией blend . Это довольно ужасно:

# 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 рейтинги