Files
face_unlock/app/lib/face/ImagePro.py
2024-09-27 01:20:28 +08:00

126 lines
4.5 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import base64
import io
import os
from PIL import Image, ImageColor
class ImageProCls:
base64FilePath=None
@staticmethod
def humanbody_blending_with_image(input_image, gray_image, bg_image):
"""
:param input_image: the PIL.Image instance, the source humanbody image
:param gray_image: the PIL.Image instance, it is created from api base64 result, a gray image
:param bg_image: the PIL.Image instance, the background image you want to replace
:return: the PIL.Image instance is blending with humanbody
notes: you should close the return object after you leave
"""
input_width, input_height = input_image.size
bg_width, bg_height = bg_image.size
input_aspect_ratio = input_width / float(input_height)
bg_aspect_ratio = bg_width / float(bg_height)
if bg_aspect_ratio > input_aspect_ratio:
target_width, target_height = int(bg_height * input_aspect_ratio), bg_height
else:
target_width, target_height = bg_width, int(bg_width / input_aspect_ratio)
crop_image = bg_image.crop((0, 0, 0+target_width, 0+target_height))
new_image = crop_image.resize((input_width, input_height))
crop_image.close()
for x in range(0, input_width):
for y in range(0, input_height):
coord = (x, y)
gray_pixel_value = gray_image.getpixel(coord)
input_rgb_color = input_image.getpixel(coord)
bg_rgb_color = new_image.getpixel(coord)
confidence = gray_pixel_value / 255.0
alpha = confidence
R = input_rgb_color[0] * alpha + bg_rgb_color[0] * (1 - alpha)
G = input_rgb_color[1] * alpha + bg_rgb_color[1] * (1 - alpha)
B = input_rgb_color[2] * alpha + bg_rgb_color[2] * (1 - alpha)
R = max(0, min(int(R), 255))
G = max(0, min(int(G), 255))
B = max(0, min(int(B), 255))
new_image.putpixel(coord, (R, G, B))
return new_image
@staticmethod
def humanbody_blending_with_color(input_image, gray_image, bg_color):
"""
:param input_image: the PIL.Image instance
:param gray_image: the PIL.Image instance, it is created from api base64 result, it is a gray image
:param bg_color: a color string value, such as '#FFFFFF'
:return: PIL.Image instance
notes: you should close the return object after you leave
"""
input_width, input_height = input_image.size
bg_rgb_color = ImageColor.getrgb(bg_color)
new_image = Image.new("RGB", input_image.size, bg_color)
for x in range(0, input_width):
for y in range(0, input_height):
coord = (x, y)
gray_pixel_value = gray_image.getpixel(coord)
input_rgb_color = input_image.getpixel(coord)
confidence = gray_pixel_value / 255.0
alpha = confidence
R = input_rgb_color[0] * alpha + bg_rgb_color[0] * (1 - alpha)
G = input_rgb_color[1] * alpha + bg_rgb_color[1] * (1 - alpha)
B = input_rgb_color[2] * alpha + bg_rgb_color[2] * (1 - alpha)
R = max(0, min(int(R), 255))
G = max(0, min(int(G), 255))
B = max(0, min(int(B), 255))
new_image.putpixel(coord, (R, G, B))
return new_image
@staticmethod
def getSegmentImg(filePath):
input_file = ''
with open(filePath, 'r') as f:
input_file = f.read()
input_file = base64.b64decode(input_file)
gray_image = Image.open(io.BytesIO(input_file))
input_image = Image.open('./imgResource/segment.jpg', 'r')
new_image = ImageProCls.humanbody_blending_with_color(input_image, gray_image, '#FFFFFF')
new_image.save('./imgResource/resultImg.jpg')
print('-' * 60)
print('结果已经生成生成文件名resultImg.jpg请在imgResource/目录下查看')
if os.path.exists(filePath):
os.remove(filePath)
f.close()
new_image.close()
input_image.close()
gray_image.close()
@staticmethod
def getMergeImg(base64Str):
imgdata = base64.b64decode(base64Str)
file = open('./imgResource/MergeResultImg.jpg', 'wb')
file.write(imgdata)
file.close()
print('结果已经生成生成文件名MergeResultImg.jpg请在imgResource/目录下查看')