Mam przezroczysty obraz png „foo.png” i otworzyłem inny obraz za pomocą
im = Image.open("foo2.png");
teraz potrzebuję scalenia foo.png z foo2.png.
(foo.png zawiera jakiś tekst i chcę wydrukować ten tekst na foo2.png)
Mam przezroczysty obraz png „foo.png” i otworzyłem inny obraz za pomocą
im = Image.open("foo2.png");
teraz potrzebuję scalenia foo.png z foo2.png.
(foo.png zawiera jakiś tekst i chcę wydrukować ten tekst na foo2.png)
;
na końcu swoich poleceń w Pythonie: jest brzydki ...Odpowiedzi:
Pierwszy parametr
.paste()
to obraz do wklejenia. Drugi to współrzędne, a tajemniczy sos to trzeci parametr. Wskazuje maskę, która zostanie użyta do wklejenia obrazu. Jeśli przekazujesz obraz z przezroczystością, kanał alfa jest używany jako maska.Sprawdź dokumenty .
źródło
foreground.convert('RGBA')
parametru maski.ValueError: bad transparency mask
ValueError: bad transparency mask
użyciebg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
nie działa zgodnie z oczekiwaniami, gdy obraz tła również zawiera przezroczystość. Musisz użyć prawdziwego Alpha Compositing .Poduszka 2.0 zawiera
alpha_composite
funkcję, która to robi.EDYCJA: Oba obrazy muszą być typu RGBA. Więc musisz zadzwonić,
convert('RGBA')
jeśli są paletowane, itp. Jeśli tło nie ma kanału alfa, możesz użyć zwykłej metody wklejania (która powinna być szybsza).źródło
ValueError: image has wrong made
@DenizOzgerJak już zauważył olt ,
Image.paste
nie działa poprawnie, gdy źródło i miejsce docelowe zawierają alfę.Rozważ następujący scenariusz:
Dwa obrazy testowe, oba zawierają alfa:
Komponowanie obrazu za pomocą
Image.paste
:tworzy następujący obraz (część alfa nałożonych czerwonych pikseli jest całkowicie pobierana z drugiej warstwy. Piksele nie są mieszane prawidłowo):
Komponowanie obrazu za pomocą
Image.alpha_composite
:tworzy następujący (poprawny) obraz:
źródło
alpha_composite
nie możesz ustawić przesunięcia, czy mógłbyś podać przykład całkowitego zastąpieniapaste
funkcji?Można też zastosować blendowanie:
źródło
źródło
Miałem podobne pytanie i trudno było znaleźć odpowiedź. Poniższa funkcja umożliwia wklejenie obrazu z parametrem przezroczystości do innego obrazu z określonym przesunięciem.
źródło
ValueError: images do not match
Skończyło się na kodowaniu sobie sugestii tego komentarza że sam kodowałem złożoną przez użytkownika @ P.Melch i zasugerowaną przez @Mithril w projekcie, nad którym pracuję.
Zakodowałem również poza granicami bezpieczeństwa, oto kod do tego . (Połączyłem konkretne zatwierdzenie, ponieważ w przyszłości to repozytorium może się zmienić)
Uwaga: Spodziewam się tablic numpy z obrazów, takich
np.array(Image.open(...))
jak wejścia A i Bcopy_from
oraz te połączoneoverlay
argumenty funkcji .Zależnościami są funkcja tuż przed nią,
copy_from
metoda i tablice numpy jako zawartość obrazu PIL do wycinania.Chociaż plik jest bardzo zorientowany na klasy, jeśli chcesz użyć tej funkcji
overlay_transparent
, pamiętaj o zmianie nazwy plikuself.frame
tablicę numpy obrazu tła.Lub możesz po prostu skopiować cały plik (prawdopodobnie usunąć niektóre importy i
Utils
klasę) i wejść w interakcję z tą klasą Frame w następujący sposób:Następnie masz swoją
background.frame
jako nakładaną i skomponowaną tablicę alfa, możesz pobrać z niej obraz PIL za pomocąoverlayed = Image.fromarray(background.frame)
lub czegoś takiego:Lub po prostu
background.save("save path")
tak, jak pobiera się bezpośrednio ze złożonejself.frame
zmiennej wewnętrznej alfa .Można odczytać pliku i znaleźć jakieś inne funkcje ładny z tej implementacji I kodowanej podobnie jak metody
get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)Prawdopodobnie chciałbyś usunąć
resolve_pending
metodę, ponieważ jest ona specyficzna dla tego projektu.Cieszę się, że pomogłem, koniecznie sprawdź repozytorium projektu o którym mówię, to pytanie i wątek bardzo mi pomogły w rozwoju :)
źródło