diff --git a/facefusion/filesystem.py b/facefusion/filesystem.py index 3d46ba0..1e03957 100644 --- a/facefusion/filesystem.py +++ b/facefusion/filesystem.py @@ -85,20 +85,6 @@ def resolve_relative_path(path : str) -> str: return os.path.abspath(os.path.join(os.path.dirname(__file__), path)) -def sanitize_path_for_windows(full_path : str) -> Optional[str]: - buffer_size = 0 - - while True: - unicode_buffer = ctypes.create_unicode_buffer(buffer_size) - buffer_limit = ctypes.windll.kernel32.GetShortPathNameW(full_path, unicode_buffer, buffer_size) #type:ignore[attr-defined] - - if buffer_size > buffer_limit: - return unicode_buffer.value - if buffer_limit == 0: - return None - buffer_size = buffer_limit - - def copy_file(file_path : str, move_path : str) -> bool: if is_file(file_path): shutil.copy(file_path, move_path) diff --git a/facefusion/vision.py b/facefusion/vision.py index 04c1b5e..e9b1a14 100644 --- a/facefusion/vision.py +++ b/facefusion/vision.py @@ -1,3 +1,4 @@ +import os from functools import lru_cache from typing import List, Optional, Tuple @@ -7,7 +8,7 @@ from cv2.typing import Size import facefusion.choices from facefusion.common_helper import is_windows -from facefusion.filesystem import is_image, is_video, sanitize_path_for_windows +from facefusion.filesystem import is_image, is_video from facefusion.typing import Duration, Fps, Orientation, Resolution, VisionFrame @@ -28,7 +29,8 @@ def read_static_images(image_paths : List[str]) -> List[VisionFrame]: def read_image(image_path : str) -> Optional[VisionFrame]: if is_image(image_path): if is_windows(): - image_path = sanitize_path_for_windows(image_path) + image_binary = numpy.fromfile(image_path, dtype = numpy.uint8) + return cv2.imdecode(image_binary, cv2.IMREAD_COLOR) return cv2.imread(image_path) return None @@ -36,7 +38,10 @@ def read_image(image_path : str) -> Optional[VisionFrame]: def write_image(image_path : str, vision_frame : VisionFrame) -> bool: if image_path: if is_windows(): - image_path = sanitize_path_for_windows(image_path) + _, file_extension = os.path.splitext(image_path) + _, vision_frame = cv2.imencode(file_extension, vision_frame) + vision_frame.tofile(image_path) + return is_image(image_path) return cv2.imwrite(image_path, vision_frame) return False @@ -45,7 +50,9 @@ def detect_image_resolution(image_path : str) -> Optional[Resolution]: if is_image(image_path): image = read_image(image_path) height, width = image.shape[:2] - return width, height + + if width > 0 and height > 0: + return width, height return None @@ -74,8 +81,6 @@ def create_image_resolutions(resolution : Resolution) -> List[str]: def get_video_frame(video_path : str, frame_number : int = 0) -> Optional[VisionFrame]: if is_video(video_path): - if is_windows(): - video_path = sanitize_path_for_windows(video_path) video_capture = cv2.VideoCapture(video_path) if video_capture.isOpened(): frame_total = video_capture.get(cv2.CAP_PROP_FRAME_COUNT) @@ -89,8 +94,6 @@ def get_video_frame(video_path : str, frame_number : int = 0) -> Optional[Vision def count_video_frame_total(video_path : str) -> int: if is_video(video_path): - if is_windows(): - video_path = sanitize_path_for_windows(video_path) video_capture = cv2.VideoCapture(video_path) if video_capture.isOpened(): video_frame_total = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT)) @@ -101,8 +104,6 @@ def count_video_frame_total(video_path : str) -> int: def detect_video_fps(video_path : str) -> Optional[float]: if is_video(video_path): - if is_windows(): - video_path = sanitize_path_for_windows(video_path) video_capture = cv2.VideoCapture(video_path) if video_capture.isOpened(): video_fps = video_capture.get(cv2.CAP_PROP_FPS) @@ -154,8 +155,6 @@ def restrict_trim_frame(video_path : str, trim_frame_start : Optional[int], trim def detect_video_resolution(video_path : str) -> Optional[Resolution]: if is_video(video_path): - if is_windows(): - video_path = sanitize_path_for_windows(video_path) video_capture = cv2.VideoCapture(video_path) if video_capture.isOpened(): width = video_capture.get(cv2.CAP_PROP_FRAME_WIDTH) @@ -194,7 +193,7 @@ def create_video_resolutions(resolution : Resolution) -> List[str]: def normalize_resolution(resolution : Tuple[float, float]) -> Resolution: width, height = resolution - if width and height: + if width > 0 and height > 0: normalize_width = round(width / 2) * 2 normalize_height = round(height / 2) * 2 return normalize_width, normalize_height diff --git a/tests/test_filesystem.py b/tests/test_filesystem.py index 137bbcf..70878fa 100644 --- a/tests/test_filesystem.py +++ b/tests/test_filesystem.py @@ -2,9 +2,8 @@ import os.path import pytest -from facefusion.common_helper import is_windows from facefusion.download import conditional_download -from facefusion.filesystem import copy_file, create_directory, filter_audio_paths, filter_image_paths, get_file_size, has_audio, has_image, in_directory, is_audio, is_directory, is_file, is_image, is_video, list_directory, remove_directory, same_file_extension, sanitize_path_for_windows +from facefusion.filesystem import create_directory, filter_audio_paths, filter_image_paths, get_file_size, has_audio, has_image, in_directory, is_audio, is_directory, is_file, is_image, is_video, list_directory, remove_directory, same_file_extension from .helper import get_test_example_file, get_test_examples_directory, get_test_outputs_directory @@ -16,7 +15,6 @@ def before_all() -> None: 'https://github.com/facefusion/facefusion-assets/releases/download/examples-3.0.0/source.mp3', 'https://github.com/facefusion/facefusion-assets/releases/download/examples-3.0.0/target-240p.mp4' ]) - copy_file(get_test_example_file('source.jpg'), get_test_example_file('söurce.jpg')) def test_get_file_size() -> None: @@ -91,12 +89,6 @@ def test_filter_image_paths() -> None: assert filter_audio_paths([ 'invalid' ]) == [] -def test_sanitize_path_for_windows() -> None: - if is_windows(): - assert sanitize_path_for_windows(get_test_example_file('söurce.jpg')).endswith('SURCE~1.JPG') - assert sanitize_path_for_windows('invalid') is None - - def test_create_directory() -> None: create_directory_path = os.path.join(get_test_outputs_directory(), 'create_directory') diff --git a/tests/test_vision.py b/tests/test_vision.py index f315638..6d104d0 100644 --- a/tests/test_vision.py +++ b/tests/test_vision.py @@ -39,7 +39,6 @@ def test_read_image() -> None: assert read_image('invalid') is None -@pytest.mark.skip() def test_write_image() -> None: vision_frame = read_image(get_test_example_file('target-240p.jpg'))