Spaces:
Running
Running
| import random | |
| import string | |
| import numpy as np | |
| import pytoshop | |
| from pytoshop import layers | |
| def randomname(n): | |
| randlst = [random.choice(string.ascii_letters + string.digits) for i in range(n)] | |
| return "".join(randlst) | |
| def add_psd(psd: pytoshop.core.PsdFile, img, name, mode): | |
| layer_1 = layers.ChannelImageData(image=img[:, :, 3], compression=1) | |
| layer0 = layers.ChannelImageData(image=img[:, :, 0], compression=1) | |
| layer1 = layers.ChannelImageData(image=img[:, :, 1], compression=1) | |
| layer2 = layers.ChannelImageData(image=img[:, :, 2], compression=1) | |
| new_layer = layers.LayerRecord( | |
| channels={-1: layer_1, 0: layer0, 1: layer1, 2: layer2}, | |
| top=0, | |
| bottom=img.shape[0], | |
| left=0, | |
| right=img.shape[1], | |
| blend_mode=mode, | |
| name=name, | |
| opacity=255, | |
| ) | |
| psd.layer_and_mask_info.layer_info.layer_records.append(new_layer) | |
| return psd | |
| def save_psd(input_image: np.ndarray, layers, names, modes, output_dir, layer_mode): | |
| psd = pytoshop.core.PsdFile( | |
| num_channels=3, height=input_image.shape[0], width=input_image.shape[1] | |
| ) | |
| if layer_mode == "normal": | |
| for idx, output in enumerate(layers[0]): | |
| psd = add_psd(psd, layers[0][idx], names[0] + str(idx), modes[0]) | |
| psd = add_psd(psd, layers[1][idx], names[1] + str(idx), modes[1]) | |
| psd = add_psd(psd, layers[2][idx], names[2] + str(idx), modes[2]) | |
| else: | |
| for idx, output in enumerate(layers[0]): | |
| psd = add_psd(psd, layers[0][idx], names[0] + str(idx), modes[0]) | |
| psd = add_psd(psd, layers[1][idx], names[1] + str(idx), modes[1]) | |
| psd = add_psd(psd, layers[2][idx], names[2] + str(idx), modes[2]) | |
| psd = add_psd(psd, layers[3][idx], names[3] + str(idx), modes[3]) | |
| psd = add_psd(psd, layers[4][idx], names[4] + str(idx), modes[4]) | |
| name = randomname(10) | |
| with open(f"{output_dir}/output_{name}.psd", "wb") as fd2: | |
| psd.write(fd2) | |
| return f"{output_dir}/output_{name}.psd" | |