- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 GaussianBlur
滤镜编辑来 self 的 discord 用户的 avatar
图像,将其裁剪成圆形并覆盖图像。所以所有这些都有效,但是裁剪后的 gif 有角,我不想要它们。它应该是透明的。我搜索了很多解决方案但找不到。我对使用 python 的 pillow 编码没有经验库,不知道如何修复它。
我当前的代码对此进行了转换(图片 1):
进入这个(图片 2):
但它应该是这样的(适用于静态图像,但 GIF 应该在最后保留它们的动画):
您可以看到我裁剪后的 GIF 图像有白角。如果图片 1 是 PNG,它不包含它们。那么如何去除这些白角呢?
这是我目前使用的代码:
def crop_center(pil_img, crop_width, crop_height):
img_width, img_height = pil_img.size
return pil_img.crop(((img_width - crop_width) // 2,
(img_height - crop_height) // 2,
(img_width + crop_width) // 2,
(img_height + crop_height) // 2))
def crop_max_square(pil_img):
return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
def mask_circle_transparent(pil_img, blur_radius, offset=0):
offset = blur_radius * 2 + offset
mask = Image.new("L", pil_img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
result = pil_img.copy()
result.putalpha(mask)
return result
async def on_message(message):
if ".gif" in str(message.author.avatar_url):
frames = []
gif = Image.open(BytesIO(await message.author.avatar_url.read()))
for frame in ImageSequence.Iterator(gif):
frame = frame.copy()
frame = frame.convert("RGB")
frame = frame.resize((256, 256))
frame = mask_circle_transparent(frame, 4)
background = background.resize((256, 256))
frame.paste(background, (0, 0), background)
frames.append(frame)
print(str(frames))
frames[0].save('temp_images/result.gif', save_all=True, append_images=frames[1:])
else:
im_square = crop_max_square(Image.open(BytesIO(await message.author.avatar_url.read())).convert("RGB"))
im_square = im_square.resize((256, 256))
im_thumb = mask_circle_transparent(im_square, 4)
background = background.resize((256, 256))
im_thumb.paste(background, (0, 0), background)
im_thumb.show()
im_thumb.save('temp_images/result.png')
编辑:我现在测试了很多,我认为 frame = mask_circle_transparent(frame, 4)
是这里的问题,在我调用该函数之前我的框架是空白的,只是一个背景。我不知道为什么。显然,角落不是白色的,它是图像背景的颜色或类似的颜色?我不知道。
最佳答案
使用 GIF 格式无法制作平滑的边缘。 GIF 没有 alpha channel ,因此不支持部分透明度(来源:How to get better transparency with GIFs?)。这意味着您在静态图像上取得的结果无法在动态 GIF 上取得。
但是,可以使用以下答案使 GIF 中的背景透明:transparent background in gif using Python Imageio .您可以在下面找到生成的 GIF 和实现此结果的代码。 (我不得不跳过你代码的一些部分,因为我没有背景图片和 Discord 连接)。
from PIL import Image, ImageDraw, ImageFilter, ImageSequence
import numpy as np
def crop_center(pil_img, crop_width, crop_height):
img_width, img_height = pil_img.size
return pil_img.crop(((img_width - crop_width) // 2,
(img_height - crop_height) // 2,
(img_width + crop_width) // 2,
(img_height + crop_height) // 2))
def crop_max_square(pil_img):
return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
def mask_circle_transparent(pil_img, blur_radius, offset=0):
offset = blur_radius * 2 + offset
mask = Image.new("L", pil_img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((offset, offset, pil_img.size[0] - offset, pil_img.size[1] - offset), fill=255)
mask = mask.filter(ImageFilter.GaussianBlur(blur_radius))
result = pil_img.copy()
result.putalpha(mask)
return result
def transparent_frame(im):
# im = Image.open(path)
alpha = im.getchannel('A')
# Convert the image into P mode but only use 255 colors in the palette out of 256
im = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
# Set all pixel values below 128 to 255 , and the rest to 0
mask = Image.eval(alpha, lambda a: 255 if a <=128 else 0)
# Paste the color of index 255 and use alpha as a mask
im.paste(255, mask)
# The transparency index is 255
im.info['transparency'] = 255
return im
def on_message(message):
# if ".gif" in str(message.author.avatar_url):
frames = []
gif = Image.open('a.gif')
for frame in ImageSequence.Iterator(gif):
frame = frame.copy()
frame = frame.convert("RGB")
frame = frame.resize((256, 256))
frame = mask_circle_transparent(frame, 4)
# I did not have the background image that you used, so i skipped this part
# background = background.resize((256, 256))
# frame.paste(background, (0, 0), background)
# make transparent using the transparent_frame() function
frame = transparent_frame(frame)
frames.append(frame)
# print(str(frames))
frames[0].save('result.gif', save_all=True, append_images=frames[1:], optimize=False) # optimize must be false to preserve the transparent channel
# else:
# im_square = crop_max_square(Image.open(BytesIO(await message.author.avatar_url.read())).convert("RGB"))
# im_square = im_square.resize((256, 256))
# im_thumb = mask_circle_transparent(im_square, 4)
# background = background.resize((256, 256))
# im_thumb.paste(background, (0, 0), background)
# im_thumb.show()
# im_thumb.save('temp_images/result.png')
if __name__ == "__main__":
on_message('hi')
关于python - 我怎样才能用 python 的枕头使我裁剪的 gif 角透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69467726/
是否有可能(在 cmd 批处理 ffmpeg 中)拍摄宽度已知(1920px)但高度未知的图像,如果超过,则将高度裁剪为特定的值?基本上是最大高度裁剪。 我玩过缩放和裁剪,但我无法得到我需要的结果。任
我有两个 SpatialPolygonsDataFrame文件:dat1、dat2 extent(dat1) class : Extent xmin : -180 xmax
我在 TensorFlow 上实现了全卷积网络。它使用编码器-解码器结构。训练时,我始终使用相同的图像大小(224x224,使用随机裁剪)并且一切正常。 在干扰阶段,我想一次预测一张图像,因为我想使用
我在 TensorFlow 上实现了全卷积网络。它使用编码器-解码器结构。训练时,我始终使用相同的图像大小(224x224,使用随机裁剪)并且一切正常。 在干扰阶段,我想一次预测一张图像,因为我想使用
我有一个需要裁剪的 View 。我有 4 个 View 显示在主视图上查看的视频 subview 。由于视频比例,我需要裁剪使视频成为正方形而不是矩形的 View 。这是我的代码: - (void)v
我正在构建一个使用 Parse 作为我的后端的网络应用程序。 部分注册过程涉及用户上传和裁剪图片,然后我将其传递到我的数据库(图片是用户个人资料的一部分,类似于您在 Twitter 上所做的)。 我已
我正在制作一个基于立方体的游戏(一切都是立方体),目前正在尝试通过不在视野之外绘制东西来优化它。 以下内容仅适用于 x 和 y 平面,稍后我会担心 z ......所以现在只进行侧面裁剪。 我知道我自
我正在尝试在 iOS 上实现单指图像缩放/裁剪。类似于柯比·特纳的单指旋转。我正在寻找现有的库,或者如果您可以帮助我处理代码本身,那就太好了。 最佳答案 我不太清楚你所说的一指裁剪是什么意思,但我为
从这里: http://www.kylejlarson.com/blog/2011/how-to-create-pie-charts-with-css3/ .pieContainer
我已经设置了一个 SKScene 用作 SKReferenceNode。雪橇是一个 SKSpriteNode,在引用节点场景中定义了一个自定义类,所有的狗都是雪橇 Sprite 的 child 。自定
我有一个库,其中包含一些图像处理算法,包括感兴趣区域(裁剪)算法。使用 GCC 编译时,自动矢量化器会加速很多代码,但会降低 Crop 算法的性能。是否有标记某个循环以被矢量化器忽略的方法,或者是否有
代码位于 http://jsfiddle.net/rSSXu/ Child #parent { margin-left:auto; margin-right:auto;
我搜索了很多以删除不需要的空间,但找不到。我只找到可用于删除黑白背景空间的链接。但我的背景图片可以是任何东西。所以,如果我有这些图片, 我如何提取我需要的图像部分。例如, 最佳答案 这是我对你的问题的
我正在尝试将 CMSampleBufferRef 中的图像裁剪为特定大小。我正在执行 5 个步骤 - 1. 从 SampleBuffer 获取 PixelBuffer 2. 将 PixelBuffer
我读到它是自动的,但在我的案例中似乎没有发生。使用 UIImagePickerController 并将 allowsEditing 设置为 YES 我得到了带有裁剪方形叠加层的编辑 View ,但是
我正在寻找一种高效的方法来裁剪二维数组。考虑这个例子: 我有一个构成 100x100 网格的二维数组。我只想返回其中的一部分,60x60。这是一个“a”方法的示例,但我正在寻找指向执行此操作的最高性能
我有一个接受 UIImage 的类,用它初始化一个 CIImage,如下所示: workingImage = CIImage.init(image: baseImage!) 然后使用图像以 3x3 的
我正在尝试显示来自 mysql 数据库的图像。有些图像显示正确,但有些图像在底部显示为剪切/裁剪,裁剪部分仅显示为空白,当它成为图像的一部分时,您真的无法摆脱。 CSS 无法解决这个问题,使用 ima
我有个问题。我有什么理由不应该使用这个 Intent: Intent intent = new Intent("com.android.camera.action.CROP"); 为了裁剪我刚刚拍摄的
我有一些代码可以调整图像大小,因此我可以获得图像中心的缩放 block - 我使用它来获取 UIImage 并返回一个小的方形表示图片,类似于在照片应用程序的相册 View 中看到的内容。 (我知道我
我是一名优秀的程序员,十分优秀!