Ich habe ein JPEG:
Ich möchte das PNG einfügen:
Auf Position 128x128 im JPEG.
Wenn Sie das tun
vips insert tile.jpg pin.png newimage.jpg 128 128
Es gibt mir Error Output: insert: images must have the same number of bands, or one must be single-band
da pin.jpg einen Alpha-Kanal hat und tile.jpg nicht.
Also konvertiere ich das JPG in PNG:
convert tile.jpg png32:tile.png
Jetzt habe ich eine tile.png mit Alpha Channel:
Aber wenn ich jetzt anrufe:
vips insert tile.png pin.png newimage.png 128 128
Ich bekomme folgendes:
Der Hintergrund der eingefügten pin.png ist weiß.
Ich habe vips insert --help-all
überprüft, aber keinen wirklich hilfreichen Befehlszeilenparameter gefunden. Beide Bilder haben einen Alphakanal. Meine Fragen:
insert
transparenten Hintergrund?LG
Codecitizen
Hallo @codecitizen ,
insert
ist eine Operation auf sehr niedriger Ebene: Es wird nur ein Bild über das andere gelegt, es wird keine Überblendung durchgeführt.
In aktuellen Libvips müssen Sie ifthenelse
mit der Option blend
. Es ist ziemlich schrecklich:
# 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
So generieren Sie dies:
libvips 8.6 hat einen schicken neuen composite
-Operator, der alle üblichen Mischmodi ausführen kann. Du kannst tun:
vips composite "background.jpg marker.png" final.jpg 2
2
bedeutet over
Mischmodus. Es unterstützt alle PDF-Mischmodi. Es sollte in einer Woche oder so heraus sein.
@jcupitt Hey, danke. Ich habe libvips 8.6 installiert und vips composite
super funktioniert. Ich bin mir nur nicht sicher, wie ich einen Ort des zweiten Bildes angeben soll, wenn möglich.
Sie können die Überlagerung vergrößern, um sie an das große Bild anzupassen, und dann Folgendes komponieren:
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
Oder schneiden Sie einen Teil des Hintergrunds aus, komponieren Sie und fügen Sie ihn wieder ein (wie oben).
Dies scheint eine übliche Sache zu sein, vielleicht sollte es eine Option geben, um die Position anzugeben.
Genial! Vielen Dank für die schnelle Hilfe!
Hilfreichster Kommentar
Sie können die Überlagerung vergrößern, um sie an das große Bild anzupassen, und dann Folgendes komponieren:
Oder schneiden Sie einen Teil des Hintergrunds aus, komponieren Sie und fügen Sie ihn wieder ein (wie oben).
Dies scheint eine übliche Sache zu sein, vielleicht sollte es eine Option geben, um die Position anzugeben.