Spaces:
Sleeping
Sleeping
File size: 5,886 Bytes
ad8cacf |
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
"""
Main processing functionality.
"""
import os
import tempfile
from loguru import logger
from utils.grid_splitter import process_grid_image
from .background import handle_background_removal
from .caption import handle_caption_generation
from .svg import (
handle_svg_conversion,
create_zip_archive
)
from .utils import create_result_text
def process_image(image_path, rows_val, cols_val, remove_bg_val, bg_method_val,
remove_rectangle_val, area_threshold_val, use_gemini_val, api_key_val,
model_val, caption_prompt_val, color_mode_val, hierarchical_val, mode_val,
filter_speckle_val, color_precision_val, corner_threshold_val,
grid_display_val):
"""
Main processing function for the application.
Args:
image_path (str): Path to the input image
rows_val (int): Number of rows in the grid
cols_val (int): Number of columns in the grid
remove_bg_val (bool): Whether to remove background
bg_method_val (str): Background removal method ('simple' or 'advanced')
remove_rectangle_val (bool): Whether to remove largest rectangle from SVG
area_threshold_val (float): Area ratio threshold for background detection
use_gemini_val (bool): Whether to use Gemini for captioning
api_key_val (str): Google API Key for Gemini
model_val (str): Model name for Gemini
caption_prompt_val (str): Prompt for caption generation
color_mode_val (str): SVG color mode
hierarchical_val (str): SVG hierarchy mode
mode_val (str): SVG trace mode
filter_speckle_val (int): Noise filter value
color_precision_val (int): Color precision value
corner_threshold_val (int): Corner threshold value
grid_display_val (bool): Whether to display grid layout
Returns:
tuple: (overview_image_path, result_text, output_file_list, svg_preview_html, zip_file)
"""
logger.info("Starting image processing...")
if not image_path:
return None, "η»εγγ’γγγγΌγγγγ¦γγΎγγγ", [], "", None
try:
# Create temporary directory
temp_dir = tempfile.mkdtemp()
output_dir = os.path.join(temp_dir, "output")
# Grid splitting process
result = process_grid_image(
image_path=image_path,
output_base_dir=output_dir,
rows=rows_val,
cols=cols_val
)
refined_paths = result['refined_paths']
# Background removal process (optional)
if remove_bg_val:
refined_paths = handle_background_removal(
refined_paths, output_dir, bg_method_val
)
# Gemini caption generation and file renaming (optional)
if use_gemini_val and api_key_val:
refined_paths = handle_caption_generation(
refined_paths, output_dir, api_key_val, model_val, caption_prompt_val
)
# SVG conversion parameters
svg_params = {
'COLORMODE': color_mode_val,
'HIERARCHICAL': hierarchical_val,
'MODE': mode_val,
'FILTER_SPECKLE': filter_speckle_val,
'COLOR_PRECISION': color_precision_val,
'CORNER_THRESHOLD': corner_threshold_val,
'LENGTH_THRESHOLD': 4.0, # γγγ©γ«γε€
'MAX_ITERATIONS': 10, # γγγ©γ«γε€
'SPLICE_THRESHOLD': 45, # γγγ©γ«γε€
'PATH_PRECISION': 9, # γγγ©γ«γε€
'LAYER_DIFFERENCE': 16 # γγγ©γ«γε€γθΏ½ε
}
# SVG conversion process
logger.info("Starting SVG conversion...")
svg_files = handle_svg_conversion(
refined_paths, output_dir, svg_params,
remove_rectangle=remove_rectangle_val,
area_threshold=area_threshold_val,
grid_display=grid_display_val,
rows=rows_val,
cols=cols_val
)
# Create result text
result_text = create_result_text(
result, remove_bg_val, bg_method_val, remove_rectangle_val,
use_gemini_val, api_key_val, svg_files,
grid_display_val
)
# Prepare output files
individual_files = svg_files.copy()
zip_file = None
svg_preview_html = "<div style='text-align:center'>SVGγηζγγγ¦γγΎγγ</div>"
# Create SVG preview if grid display is enabled
if grid_display_val and svg_files:
grid_file = os.path.join(output_dir, "grid_layout.svg")
if os.path.exists(grid_file):
try:
with open(grid_file, 'r', encoding='utf-8') as f:
svg_content = f.read()
svg_preview_html = f"<div style='text-align:center'>{svg_content}</div>"
except Exception as e:
logger.error(f"Error reading grid SVG: {str(e)}")
individual_files.append(grid_file)
# Create ZIP archive
if svg_files:
zip_file = create_zip_archive(svg_files, output_dir)
# Add overview image if available
if result['overview_path']:
individual_files.append(result['overview_path'])
return result['overview_path'], result_text, individual_files, svg_preview_html, zip_file
except Exception as e:
import traceback
error_text = f"γ¨γ©γΌγηΊηγγΎγγ: {str(e)}\n"
error_text += traceback.format_exc()
return None, error_text, [], "", None
|