Spaces:
Building
Building
File size: 2,129 Bytes
d49f7bc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# Copyright (c) Meta Platforms, Inc. and affiliates.
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
from PIL import Image, ImageOps
import numpy as np
import numpy.typing as npt
import cv2
from pathlib import Path
import logging
from pkg_resources import resource_filename
TOLERANCE = 10**-5
def resolve_ad_filepath(file_name: str, file_type: str) -> Path:
"""
Given input filename, attempts to find the file, first by relative to cwd,
then by absolute, the relative to animated_drawings root directory.
If not found, prints error message indicating which file_type it is.
"""
if Path(file_name).exists():
return Path(file_name)
elif Path.joinpath(Path.cwd(), file_name).exists():
return Path.joinpath(Path.cwd(), file_name)
elif Path(resource_filename(__name__, file_name)).exists():
return Path(resource_filename(__name__, file_name))
elif Path(resource_filename(__name__, str(Path('..', file_name)))):
return Path(resource_filename(__name__, str(Path('..', file_name))))
msg = f'Could not find the {file_type} specified: {file_name}'
logging.critical(msg)
assert False, msg
def read_background_image(file_name: str) -> npt.NDArray[np.uint8]:
"""
Given path to input image file, opens it, flips it based on EXIF tags, if present, and returns image with proper orientation.
"""
# Check the file path
file_path = resolve_ad_filepath(file_name, 'background_image')
# Open the image and rotate as needed depending upon exif tag
image = Image.open(str(file_path))
image = ImageOps.exif_transpose(image)
# Convert to numpy array and flip rightside up
image_np = np.asarray(image)
image_np = cv2.flip(image_np, 0)
# Ensure we have RGBA
if len(image_np.shape) == 3 and image_np.shape[-1] == 3: # if RGB
image_np = cv2.cvtColor(image_np, cv2.COLOR_RGB2RGBA)
if len(image_np.shape) == 2: # if grayscale
image_np = cv2.cvtColor(image_np, cv2.COLOR_GRAY2RGBA)
return image_np.astype(np.uint8)
|