feat: add jpeg damage filter to fx
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
import random
|
||||
from io import BytesIO
|
||||
from PIL import Image, ImageFilter, ImageDraw, ImageStat, ImageFont
|
||||
from PIL import ImageEnhance
|
||||
from PIL import ImageChops
|
||||
@ -167,6 +168,29 @@ class ImageFilterImplement:
|
||||
|
||||
return Image.fromarray(result, 'RGBA')
|
||||
|
||||
# JPEG 损坏感压缩
|
||||
@staticmethod
|
||||
def apply_jpeg_damage(image: Image.Image, quality: int = 10) -> Image.Image:
|
||||
quality = max(1, min(95, int(quality)))
|
||||
|
||||
alpha = None
|
||||
if image.mode in ('RGBA', 'LA') or (image.mode == 'P' and 'transparency' in image.info):
|
||||
rgba_image = image.convert('RGBA')
|
||||
alpha = rgba_image.getchannel('A')
|
||||
rgb_image = Image.new('RGB', rgba_image.size, (255, 255, 255))
|
||||
rgb_image.paste(rgba_image, mask=alpha)
|
||||
else:
|
||||
rgb_image = image.convert('RGB')
|
||||
|
||||
output = BytesIO()
|
||||
rgb_image.save(output, format='JPEG', quality=quality, optimize=False)
|
||||
output.seek(0)
|
||||
damaged = Image.open(output).convert('RGB')
|
||||
|
||||
if alpha is not None:
|
||||
return Image.merge('RGBA', (*damaged.split(), alpha))
|
||||
return damaged.convert('RGBA')
|
||||
|
||||
# 缩放
|
||||
@staticmethod
|
||||
def apply_resize(image: Image.Image, scale: float = 1.5, scale_y = None) -> Image.Image:
|
||||
|
||||
@ -50,6 +50,7 @@ class ImageFilterManager:
|
||||
"描边": ImageFilterImplement.apply_stroke,
|
||||
"形状描边": ImageFilterImplement.apply_shape_stroke,
|
||||
"半调": ImageFilterImplement.apply_halftone,
|
||||
"JPEG损坏": ImageFilterImplement.apply_jpeg_damage,
|
||||
"设置通道": ImageFilterImplement.apply_set_channel,
|
||||
"设置遮罩": ImageFilterImplement.apply_set_mask,
|
||||
# 图像处理
|
||||
|
||||
Reference in New Issue
Block a user