Libvips: Fügen Sie PNG mit transparentem Hintergrund in JPEG ein - Getting White Background

Erstellt am 25. Okt. 2017  ·  4Kommentare  ·  Quelle: libvips/libvips

Ich habe ein JPEG:

tile

Ich möchte das PNG einfügen:

pin

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:
tile

Aber wenn ich jetzt anrufe:

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

Ich bekomme folgendes:
inserted

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:

  • Unterstützt der Befehl libvips insert transparenten Hintergrund?
  • Wenn ja: Kann mich jemand darauf hinweisen, wie diese Funktion dann verwendet wird?
  • ... oder mache ich hier vielleicht etwas falsch?

LG
Codecitizen

question

Hilfreichster Kommentar

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.

Alle 4 Kommentare

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:

final

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!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

sonylifull picture sonylifull  ·  4Kommentare

revathi-murali picture revathi-murali  ·  3Kommentare

AKlein920 picture AKlein920  ·  3Kommentare

adamu picture adamu  ·  3Kommentare

helloqhx picture helloqhx  ·  3Kommentare