У меня есть JPEG:
Я хочу вставить PNG:
В позиции 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 с альфа-каналом:
Но когда я сейчас звоню:
vips insert tile.png pin.png newimage.png 128 128
Получаю следующее:
Фон вставленного файла pin.png белый.
Я проверил vips insert --help-all
но не нашел полезного параметра командной строки. Оба изображения имеют альфа-канал. Мои вопросы:
insert
прозрачный фон?LG
кодегорожанин
Привет @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
Чтобы сгенерировать это:
В 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
Или вырежьте часть фона, скомпонуйте, затем вставьте обратно (как указано выше).
Это кажется обычным делом, возможно, должна быть возможность указать позицию.
Потрясающие! Большое спасибо за быструю помощь!
Самый полезный комментарий
Вы можете увеличить наложение, чтобы оно соответствовало большому изображению, а затем составьте:
Или вырежьте часть фона, скомпонуйте, затем вставьте обратно (как указано выше).
Это кажется обычным делом, возможно, должна быть возможность указать позицию.