Discord.py image manipulation?
Hey,
Ich arbeite gerade an paar Image Manipulation commands für meinem bot das Problem was ich allerdings habe ist wenn ich ein Profilbild auf das Bild tuen will und das Profilbild transparent ist dann ist der Hintergrund schwarz wie im angehängten Bild kann mir vielleicht einer weiter helfen? der Code ist:
```@client.command()
async def stonks(ctx, user: discord.Member = None):
if user == None:
user = ctx.author
stonks = Image.open("stonks.jpg")
asset = user.avatar_url_as(size = 512)
data = BytesIO(await asset.read())
pfp = Image.open(data)
pfp = pfp.resize((130,130))
stonks.paste(pfp, (146,47))
stonks.save("pstonks.jpg")
await ctx.send(file = discord.File("pstonks.jpg"))```
Sorry das der Code komisch aussieht kann kriege das leider nicht besser hier reingefügt habe nochmal ein screenshot davon gemacht.
2 Antworten
Probier mal das hier aus:
import cv2
import numpy as np
# load image
img = cv2.imread('person.png')
# convert to graky
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# threshold input image as mask
mask = cv2.threshold(gray, 250, 255, cv2.THRESH_BINARY)[1]
# negate mask
mask = 255 - mask
# apply morphology to remove isolated extraneous noise
# use borderconstant of black since foreground touches the edges
kernel = np.ones((3,3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# anti-alias the mask -- blur then stretch
# blur alpha channel
mask = cv2.GaussianBlur(mask, (0,0), sigmaX=2, sigmaY=2, borderType = cv2.BORDER_DEFAULT)
# linear stretch so that 127.5 goes to 0, but 255 stays 255
mask = (2*(mask.astype(np.float32))-255.0).clip(0,255).astype(np.uint8)
# put mask into alpha channel
result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask
# save resulting masked image
cv2.imwrite('person_transp_bckgrnd.png', result)
# display result, though it won't show transparency
cv2.imshow("INPUT", img)
cv2.imshow("GRAY", gray)
cv2.imshow("MASK", mask)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Hängt das vielleicht damit zusammen, dass jpg keine transparenz unterstützt?