diff --git a/decode.py b/decode.py index 0303bd4..d39b7e9 100644 --- a/decode.py +++ b/decode.py @@ -4,42 +4,53 @@ import UnityPy from PIL import Image #made by Katboi01 -def convert(in_path, out_path): - env = UnityPy.load(in_path) +def convert(in_path, out_path, file_name): + env = UnityPy.load(os.path.join(in_path, file_name)) + textures = [] for obj in env.objects: if obj.type.name == "Texture2D": - data = obj.read() - im : Image = data.image - width, height = im.size + textures.append(obj) - left = int((width - 2) * 0.8) + if len(textures) > 1: + out_path = os.path.join(out_path, file_name) + os.makedirs(out_path, exist_ok=True) - im1 = im.crop((0, 0, left, height)) - im1_array = np.asarray(im1, dtype=np.float32) / 255 - - y_channel = im1_array[:, :, 0] - alpha_channel = im1_array[:, :, 2] + for idx, obj in enumerate(textures): + try: + data = obj.read() + im : Image = data.image + width, height = im.size - im2 = im.crop((left+2, 0, width, height)).resize((left, height), Image.NEAREST) - im2_array = np.asarray(im2, dtype=np.float32) / 255 + left = int((width - 2) * 0.8) - cr_channel = im2_array[:, :, 0] - cb_channel = im2_array[:, :, 2] + im1 = im.crop((0, 0, left, height)) + im1_array = np.asarray(im1, dtype=np.float32) / 255 + + y_channel = im1_array[:, :, 0] + alpha_channel = im1_array[:, :, 2] - cr_channel -= 0.5 - cb_channel -= 0.5 + im2 = im.crop((left+2, 0, width, height)).resize((left, height), Image.NEAREST) + im2_array = np.asarray(im2, dtype=np.float32) / 255 - r_channel = np.clip(y_channel + (1.402 * cr_channel), 0, 1) - g_channel = np.clip(y_channel + (-0.344136 * cb_channel) + (-0.714136 * cr_channel), 0, 1) - b_channel = np.clip(y_channel + (1.772 * cb_channel), 0, 1) + cr_channel = im2_array[:, :, 0] + cb_channel = im2_array[:, :, 2] - new_image = np.stack([r_channel, g_channel, b_channel, alpha_channel], axis=-1) - new_image = (new_image * 255).astype(np.uint8) + cr_channel -= 0.5 + cb_channel -= 0.5 - result = Image.fromarray(new_image) + r_channel = np.clip(y_channel + (1.402 * cr_channel), 0, 1) + g_channel = np.clip(y_channel + (-0.344136 * cb_channel) + (-0.714136 * cr_channel), 0, 1) + b_channel = np.clip(y_channel + (1.772 * cb_channel), 0, 1) - result.save(out_path, format="PNG") + new_image = np.stack([r_channel, g_channel, b_channel, alpha_channel], axis=-1) + new_image = (new_image * 255).astype(np.uint8) + + result = Image.fromarray(new_image) + + result.save(os.path.join(out_path, data.m_Name + ".png"), format="PNG") + except Exception as e: + print(f"Failed to extract ({idx}/{len(textures)}) from {file_name}", e) def main(): in_path = "decoder_in" @@ -54,6 +65,6 @@ def main(): for _, _, files in os.walk(in_path): for name in files: print(name) - convert(os.path.join(in_path, name), os.path.join(out_path, name)) + convert(in_path, out_path, name) main() \ No newline at end of file