Process icon/picture elements in context.
(self, context: ProcessingContext)
| 264 | self.load_rmbg_model() |
| 265 | |
| 266 | def process(self, context: ProcessingContext) -> ProcessingResult: |
| 267 | """Process icon/picture elements in context.""" |
| 268 | self._log("Processing Icon/Picture elements") |
| 269 | self.load_rmbg_model() |
| 270 | |
| 271 | # Load image |
| 272 | if not context.image_path or not os.path.exists(context.image_path): |
| 273 | return ProcessingResult( |
| 274 | success=False, |
| 275 | error_message="Invalid image path" |
| 276 | ) |
| 277 | |
| 278 | original_image = Image.open(context.image_path).convert("RGB") |
| 279 | cv2_image = cv2.imread(context.image_path) |
| 280 | |
| 281 | # Filter elements to process |
| 282 | elements_to_process = self._get_elements_to_process(context.elements) |
| 283 | |
| 284 | self._log(f"Elements to process: {len(elements_to_process)}") |
| 285 | |
| 286 | processed_count = 0 |
| 287 | rmbg_count = 0 |
| 288 | keep_bg_count = 0 |
| 289 | |
| 290 | for elem in elements_to_process: |
| 291 | try: |
| 292 | is_rmbg = self._process_element(elem, original_image) |
| 293 | processed_count += 1 |
| 294 | if is_rmbg: |
| 295 | rmbg_count += 1 |
| 296 | else: |
| 297 | keep_bg_count += 1 |
| 298 | except Exception as e: |
| 299 | elem.processing_notes.append(f"Failed: {str(e)}") |
| 300 | self._log(f"Element {elem.id} failed: {e}") |
| 301 | |
| 302 | self._log(f"Done: {processed_count}/{len(elements_to_process)} (RMBG:{rmbg_count}, keep_bg:{keep_bg_count})") |
| 303 | |
| 304 | return ProcessingResult( |
| 305 | success=True, |
| 306 | elements=context.elements, |
| 307 | canvas_width=context.canvas_width, |
| 308 | canvas_height=context.canvas_height, |
| 309 | metadata={ |
| 310 | 'processed_count': processed_count, |
| 311 | 'total_to_process': len(elements_to_process), |
| 312 | 'rmbg_count': rmbg_count, |
| 313 | 'keep_bg_count': keep_bg_count |
| 314 | } |
| 315 | ) |
| 316 | |
| 317 | def _get_elements_to_process(self, elements: List[ElementInfo]) -> List[ElementInfo]: |
| 318 | """Filter elements to process (icons, arrows, etc.; arrows treated as icon crop).""" |
no test coverage detected