{"id":30240319,"url":"https://github.com/backgwa/zoombelievable","last_synced_at":"2026-04-12T22:41:33.430Z","repository":{"id":295824708,"uuid":"991017615","full_name":"BackGwa/Zoombelievable","owner":"BackGwa","description":"WPF Zoom \u0026 Pan Support Image Viewer Library","archived":false,"fork":false,"pushed_at":"2025-07-09T01:43:09.000Z","size":17,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-09T02:44:25.572Z","etag":null,"topics":["csharp","image-control","image-pen","image-zoom","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BackGwa.png","metadata":{"files":{"readme":"README-ko.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-27T02:17:44.000Z","updated_at":"2025-07-09T01:43:13.000Z","dependencies_parsed_at":"2025-05-27T15:31:17.164Z","dependency_job_id":"38138e16-81cc-4b54-b277-8517a26e0b60","html_url":"https://github.com/BackGwa/Zoombelievable","commit_stats":null,"previous_names":["backgwa/zoombelievable"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BackGwa/Zoombelievable","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BackGwa%2FZoombelievable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BackGwa%2FZoombelievable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BackGwa%2FZoombelievable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BackGwa%2FZoombelievable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BackGwa","download_url":"https://codeload.github.com/BackGwa/Zoombelievable/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BackGwa%2FZoombelievable/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270524367,"owners_count":24600191,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-15T02:00:12.559Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","image-control","image-pen","image-zoom","wpf"],"created_at":"2025-08-15T04:37:18.714Z","updated_at":"2026-04-12T22:41:28.381Z","avatar_url":"https://github.com/BackGwa.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Zoombelievable\n\nZoombelievable은 이미지에 대한 대화형 확대/축소 및 이동(패닝) 기능을 제공하는 사용자 정의 WPF 컨트롤입니다. WPF 애플리케이션에 쉽게 사용하고 통합할 수 있도록 설계되었으며, 상세 이미지를 보기 위한 부드러운 사용자 경험을 제공합니다. 또한 여러 인스턴스를 함께 연결하여 변환을 동기화하는 기능을 지원합니다.\n\n## 주요 기능\n\n* **마우스 휠 확대/축소**: 마우스 휠을 사용하여 이미지를 확대하거나 축소합니다. 확대/축소는 마우스 커서 위치를 중심으로 이루어집니다.\n* **마우스 드래그 이동(패닝)**: 마우스 왼쪽 버튼을 클릭하고 드래그하여 이미지를 이동합니다.\n* **확대/축소 제한 설정**: 최소 및 최대 확대/축소 레벨을 설정할 수 있습니다 (`MinZoom`, `MaxZoom`).\n* **확대/축소 비율 조절**: 마우스 휠 스크롤에 따른 확대/축소 비율을 제어합니다 (`ZoomFactor`).\n* **프로그래밍 방식 제어**: 프로그래밍 방식으로 확대/축소, 이동 및 뷰 리셋이 가능합니다.\n* **이벤트 알림**:\n    * `ZoomChanged`: 확대/축소 레벨이 변경될 때 발생합니다. (\"줌 변경 시 발생\")\n    * `MousePositionChanged`: 마우스가 이미지 위에서 움직일 때 원본 이미지 내의 정확한 픽셀 좌표를 제공하며 발생합니다. (\"마우스 이미지 좌표 이동 시 발생\")\n* **연결된 컨트롤**: 여러 `Zoombelievable` 컨트롤을 연결하여 확대/축소, 이동 및 마우스 위치를 동기화할 수 있습니다.\n* **기능 활성화/비활성화**: 이동(`EnablePan`) 및 확대/축소(`EnableZoom`) 기능을 독립적으로 활성화하거나 비활성화할 수 있습니다.\n* **이미지 소스 유연성**: 현재 확대/축소 및 이동 상태를 유지하면서 런타임에 표시되는 이미지를 변경할 수 있습니다 (`ImageSource`).\n* **특정 지점으로 중앙 정렬**: 프로그래밍 방식으로 이미지 내의 특정 지점에 뷰를 중앙 정렬할 수 있습니다.\n* **픽셀 단위 마우스 추적**: `Stretch.Uniform` 상태에서도 원본 이미지에 대한 마우스 좌표를 정확하게 결정합니다.\n\n## 동작 방식\n\n`Zoombelievable` 컨트롤은 `Image` 컨트롤을 포함하는 `Border` 요소입니다. 변환은 확대/축소를 위한 `ScaleTransform`과 이동(패닝)을 위한 `TranslateTransform`을 포함하는 `TransformGroup`을 사용하여 적용됩니다. 마우스 이벤트 핸들러는 이러한 변환을 대화형으로 업데이트하는 데 사용됩니다.\n\n이 컨트롤의 핵심적인 측면 중 하나는 `Image` 컨트롤의 `Stretch.Uniform` 속성을 고려하여 원본 이미지 픽셀에 대한 마우스 위치를 계산하는 기능입니다. 이를 통해 정확한 좌표 보고 및 마우스 포인터 중심의 확대/축소와 같은 기능이 가능합니다.\n\n연결 메커니즘은 연결된 인스턴스 간에 확대/축소, 이동 및 마우스 위치 변경 사항을 전파하며, 내부 `_isPropagatingEvent` 플래그를 사용하여 이벤트 재귀를 방지합니다.\n\n## 속성 (Properties)\n\n다음은 사용할 수 있는 주요 의존성 속성입니다:\n\n* **`ImageSource`**: `ImageSource` - 표시할 이미지의 소스입니다.\n* **`MinZoom`**: `double` (기본값: `0.1`) - 허용되는 최소 확대/축소 레벨입니다.\n* **`MaxZoom`**: `double` (기본값: `10.0`) - 허용되는 최대 확대/축소 레벨입니다.\n* **`ZoomFactor`**: `double` (기본값: `1.2`) - 각 마우스 휠 스크롤 시 확대/축소 레벨이 변경되는 비율입니다.\n* **`CurrentZoom`**: `double` (기본값: `1.0`) - 현재 확대/축소 레벨입니다. 프로그래밍 방식으로 확대/축소하도록 설정할 수 있습니다.\n* **`PanOffsetX`**: `double` (기본값: `0.0`) - 현재 가로 이동(패닝) 오프셋입니다. 프로그래밍 방식으로 이동하도록 설정할 수 있습니다.\n* **`PanOffsetY`**: `double` (기본값: `0.0`) - 현재 세로 이동(패닝) 오프셋입니다. 프로그래밍 방식으로 이동하도록 설정할 수 있습니다.\n* **`EnablePan`**: `bool` (기본값: `true`) - 마우스 이동(패닝)을 활성화하거나 비활성화합니다.\n* **`EnableZoom`**: `bool` (기본값: `true`) - 마우스 휠 확대/축소를 활성화하거나 비활성화합니다.\n\n### 읽기 전용 속성\n\n* **`LastMouseImagePosition`**: `Point` - 원본 이미지의 픽셀 공간 내에서 마지막으로 알려진 마우스 좌표를 가져옵니다. (\"마우스가 가리키는 마지막 이미지 내부 픽셀 좌표\")\n\n## 이벤트 (Events)\n\n* **`ZoomChanged`**: `EventHandler\u003cZoomChangedEventArgs\u003e`\n    * `CurrentZoom` 속성이 변경될 때 발생합니다.\n    * `ZoomChangedEventArgs`는 `OldZoom` 및 `NewZoom` 값을 제공합니다.\n* **`MousePositionChanged`**: `EventHandler\u003cMousePositionChangedEventArgs\u003e`\n    * 마우스가 이미지 위에서 움직이고 계산된 이미지 픽셀 좌표가 변경될 때 발생합니다.\n    * `MousePositionChangedEventArgs`는 `ImagePoint` (원본 이미지에서의 마우스 좌표)를 제공합니다.\n\n## 공개 메서드 (Public Methods)\n\n* **`void LinkWith(Zoombelievable other)`**:\n    이 컨트롤을 다른 `Zoombelievable` 컨트롤과 연결합니다. 한 컨트롤의 확대/축소, 이동 또는 마우스 위치 변경 사항이 다른 컨트롤에 반영됩니다.\n* **`void UnlinkFrom(Zoombelievable other)`**:\n    지정된 `Zoombelievable` 컨트롤과의 연결을 제거합니다.\n* **`void UnlinkAll()`**:\n    이 컨트롤이 다른 `Zoombelievable` 컨트롤과 가진 모든 연결을 제거합니다.\n* **`void ResetZoom()`**:\n    확대/축소를 `1.0`으로, 이동(패닝) 오프셋을 `0,0`으로 초기화합니다. (\"줌과 패닝을 초기 상태(Zoom = 1.0, Pan = 0,0)로 리셋하고 이벤트를 발생시킵니다.\")\n* **`void ZoomIn(double factor = 0)`**:\n    프로그래밍 방식으로 확대합니다. `factor`가 `0` 이하이면 `ZoomFactor` 속성을 사용합니다.\n* **`void ZoomOut(double factor = 0)`**:\n    프로그래밍 방식으로 축소합니다. `factor`가 `0` 이하이면 `ZoomFactor` 속성을 사용합니다.\n* **`void CenterOn(Point imagePoint)`**:\n    지정된 `imagePoint`로 뷰를 중앙 정렬합니다. 포인트는 원본 이미지의 좌표계 기준이어야 합니다.\n\n## 기본 사용 예제\n\n### XAML\n\n```xml\n\u003cWindow x:Class=\"YourApp.MainWindow\"\n        xmlns=\"[http://schemas.microsoft.com/winfx/2006/xaml/presentation](http://schemas.microsoft.com/winfx/2006/xaml/presentation)\"\n        xmlns:x=\"[http://schemas.microsoft.com/winfx/2006/xaml](http://schemas.microsoft.com/winfx/2006/xaml)\"\n        xmlns:local=\"clr-namespace:Zoombelievable;assembly=Zoombelievable\" Title=\"Zoombelievable 데모\" Height=\"450\" Width=\"800\"\u003e\n    \u003cGrid\u003e\n        \u003clocal:Zoombelievable x:Name=\"myZoombelievableControl\"\n                              ImageSource=\"your_image.png\"\n                              MinZoom=\"0.5\"\n                              MaxZoom=\"5.0\"\n                              ZoomFactor=\"1.1\"\n                              EnablePan=\"True\"\n                              EnableZoom=\"True\"/\u003e\n    \u003c/Grid\u003e\n\u003c/Window\u003e\n```\n\n### C# (이벤트 또는 프로그래밍 방식 제어를 위한 코드 비하인드 예제)\n\n```csharp\nusing System.Windows;\nusing Zoombelievable; // 사용하는 네임스페이스\n\nnamespace YourApp\n{\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            // 예제: 이벤트 연결\n            myZoombelievableControl.ZoomChanged += OnZoomChanged;\n            myZoombelievableControl.MousePositionChanged += OnMouseImagePositionChanged;\n        }\n\n        private void OnZoomChanged(object sender, ZoomChangedEventArgs e)\n        {\n            // 줌 변경 처리, 예: 상태 표시줄 업데이트\n            // System.Diagnostics.Debug.WriteLine($\"줌 변경: {e.OldZoom} -\u003e {e.NewZoom}\");\n        }\n\n        private void OnMouseImagePositionChanged(object sender, MousePositionChangedEventArgs e)\n        {\n            // 마우스 위치 변경 처리, 예: 픽셀 좌표 표시\n            // System.Diagnostics.Debug.WriteLine($\"이미지 위 마우스 픽셀: {e.ImagePoint}\");\n        }\n\n        // 예제: 프로그래밍 방식 제어\n        private void SomeButton_Click(object sender, RoutedEventArgs e)\n        {\n            // myZoombelievableControl.ResetZoom();\n            // myZoombelievableControl.ZoomIn();\n            // myZoombelievableControl.CenterOn(new Point(100, 150)); // 이미지의 픽셀 (100,150) 지점으로 중앙 정렬\n        }\n\n        // 예제: 두 컨트롤 연결 (myZoombelievableControl2 라는 다른 컨트롤이 있다고 가정)\n        // public void LinkControls()\n        // {\n        //     if (myZoombelievableControl != null \u0026\u0026 myZoombelievableControl2 != null)\n        //     {\n        //         myZoombelievableControl.LinkWith(myZoombelievableControl2);\n        //     }\n        // }\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbackgwa%2Fzoombelievable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbackgwa%2Fzoombelievable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbackgwa%2Fzoombelievable/lists"}