feat: Everything2Everything 양방향 변환 매트릭스 피보팅
EverythingToJpeg(N→JPEG 단방향)에서 Everything2Everything(N×M 매트릭스)으로 앱을 피보팅. 7개 Provider, 200+ 변환 쌍 지원. 리네이밍 - 디렉토리/솔루션/csproj/namespace/AssemblyName/MSIX Identity 일괄 치환 - 임시파일 prefix e2j_ → e2e_, 로고 라벨 E2J → E2E 아키텍처 - ConversionPair(input, output) 신규 + ProviderCapability.SupportedConversions - IConverterProvider.ConvertAsync에 outputExtension 파라미터 추가 - ProviderRegistry를 Dictionary<(input, output), Provider> 매트릭스로 재작성 + OutputsForInput / OutputsForFile 쿼리 API - ConversionEngine: 출력 ext 라우팅, 동일 입출력 자동 skip, 서브폴더 suffix를 출력 ext에서 자동 도출 - ConvertOptions를 형식별 sub-record로 분리 (Jpeg/Png/Webp/Avif/Tiff/Pdf*/Html*/Ocr) Provider 매트릭스 - MagickProvider: PNG/JPEG/WebP/AVIF/BMP/TIFF/GIF/PDF 양방향 + RAW/PSD 디코딩 (단일이미지→1페이지 PDF, GIF/TIFF→다페이지 PDF) - HeicProvider: HEIC/HEIF → 이미지 7종 - PdfProvider: PDF → 이미지 6종 (PNG임베드 후 ImageMagick 인코딩) - HtmlProvider: HTML/HTM → 이미지 + PDF (CDP printToPDF) - DocxProvider/HwpxProvider: PDF + 이미지 7종 (LibreOffice 활용) - OcrProvider 신규: 이미지/PDF → TXT/DOCX (Windows.Media.Ocr + DocumentFormat.OpenXml, PDF는 페이지별 OCR 후 결합) UI - 사이드바 TARGET FORMAT을 동적 ComboBox로 (큐 파일 매트릭스의 교집합만 표시) - 출력 형식별 색상 배지 + Quality 패널 라벨 동적 - OUTPUT DESTINATION hint도 출력 ext 기반 동적 CLI - 신규 'to <ext> <files...>' verb (예: to png photo.heic doc.docx) - help 텍스트 양방향 컨셉으로 갱신 셸 통합 - ContextMenuRegistrar 카스케이드로 재설계 (ExtendedSubCommandsKey + Everything2Everything.SubMenu.<ext>) - 입력별 매트릭스에 따라 인기 출력 10종(JPEG/PNG/WebP/PDF/TXT/DOCX/AVIF/GIF/TIFF/BMP) 동적 노출, 마지막에 '변환…' 옵션 - 메뉴 라벨 'JPEG로 변환' → 'Everything2Everything으로 변환' 기타 - Core.csproj TFM net9.0-windows → net9.0-windows10.0.19041.0 (WinRT API용) - DocumentFormat.OpenXml 3.1.0 NuGet 추가 - README 양방향 매트릭스 기준 전면 개편 - MSIX appxmanifest Description / IExplorerCommand DLL 라벨 갱신 빌드: 0 errors, 0 warnings
This commit is contained in:
parent
96861e627d
commit
9b7e5f0d0c
63 changed files with 1788 additions and 733 deletions
187
README.md
187
README.md
|
|
@ -1,10 +1,27 @@
|
|||
# EverythingToJpeg
|
||||
# Everything2Everything
|
||||
|
||||
Windows 우클릭 컨텍스트 메뉴에서 한 방에 JPEG로. PNG · GIF · BMP · TIFF · WebP · AVIF · HEIC · RAW · PSD · PDF · DOCX 를 지원합니다.
|
||||
Windows 우클릭 한 방에 **모든 것을 모든 것으로** 양방향 변환. 이미지 ↔ 이미지, 이미지 ↔ PDF, 문서 ↔ PDF/이미지, HTML → PDF/이미지를 통합 매트릭스로 처리합니다.
|
||||
|
||||
- **빠른 변환** — 다이얼로그 없이 원본 폴더의 `<원본명>_jpeg/` 하위에 즉시 저장
|
||||
- **변환…** — 옵션 다이얼로그(품질, 출력 위치, 이름 충돌, 크기 제한, PDF DPI)
|
||||
- 진행 상황 + 썸네일 + 드래그 & 드롭 (메인 창)
|
||||
> 이 프로젝트는 단방향 *EverythingToJpeg* 에서 양방향 *Everything2Everything* 으로 피보팅된 결과물입니다.
|
||||
|
||||
- **카스케이드 컨텍스트 메뉴** — 입력 파일에 따라 가능한 출력 형식만 자동 노출
|
||||
- **양방향 이미지 매트릭스** — PNG ↔ JPEG ↔ WebP ↔ AVIF ↔ TIFF ↔ BMP ↔ GIF
|
||||
- **HTML → PDF**, **DOCX/HWPX ↔ PDF** 같은 문서 변환 포함
|
||||
- 출력 형식별 인코딩 옵션(JPEG quality, WebP lossless, AVIF speed 등) 분리
|
||||
- 진행 상황 + 썸네일 + 드래그 & 드롭 메인 창
|
||||
|
||||
## 변환 매트릭스
|
||||
|
||||
| Provider | 입력 | 출력 |
|
||||
|---|---|---|
|
||||
| **MagickProvider** | PNG · JPEG · WebP · AVIF · BMP · TIFF · GIF · PSD · RAW (NEF/CR2/CR3/ARW/DNG/RAF/ORF/RW2/SRW/PEF) | PNG · JPEG · WebP · AVIF · BMP · TIFF · GIF |
|
||||
| **HeicProvider** | HEIC · HEIF | PNG · JPEG · WebP · AVIF · BMP · TIFF · GIF |
|
||||
| **PdfProvider** | PDF | PNG · JPEG · WebP · AVIF · BMP · TIFF |
|
||||
| **HtmlProvider** | HTML · HTM | PNG · JPEG · WebP · AVIF · BMP · TIFF · **PDF** |
|
||||
| **DocxProvider** | DOCX · DOC | **PDF** + 이미지 7종 |
|
||||
| **HwpxProvider** | HWP · HWPX | **PDF** + 이미지 7종 |
|
||||
|
||||
총 200+ 변환 쌍 지원. 알파 채널은 출력 포맷이 지원할 때 자동 보존, 미지원이면 흰색(또는 설정된 배경색)으로 평탄화합니다.
|
||||
|
||||
## 빠른 시작
|
||||
|
||||
|
|
@ -12,65 +29,100 @@ Windows 우클릭 컨텍스트 메뉴에서 한 방에 JPEG로. PNG · GIF · BM
|
|||
|
||||
```powershell
|
||||
# 솔루션 빌드
|
||||
dotnet build EverythingToJpeg.slnx -c Release
|
||||
dotnet build Everything2Everything.slnx -c Release
|
||||
|
||||
# 단일 폴더 publish (framework-dependent, .NET 9 Desktop Runtime 필요)
|
||||
dotnet publish src\EverythingToJpeg.App\EverythingToJpeg.App.csproj `
|
||||
dotnet publish src\Everything2Everything.App\Everything2Everything.App.csproj `
|
||||
-c Release -r win-x64 --self-contained false -o publish
|
||||
|
||||
# .NET 런타임 동봉 (단일 사용자 배포가 편함)
|
||||
dotnet publish src\EverythingToJpeg.App\EverythingToJpeg.App.csproj `
|
||||
dotnet publish src\Everything2Everything.App\Everything2Everything.App.csproj `
|
||||
-c Release -r win-x64 --self-contained true `
|
||||
-p:PublishSingleFile=false -o publish-self
|
||||
```
|
||||
|
||||
산출물: `publish\EverythingToJpeg.exe`
|
||||
산출물: `publish\Everything2Everything.exe`
|
||||
|
||||
### 2) 컨텍스트 메뉴 등록
|
||||
|
||||
`EverythingToJpeg.exe`를 한 번 실행 → "컨텍스트 메뉴 등록" 클릭. 또는 CLI:
|
||||
|
||||
```powershell
|
||||
.\EverythingToJpeg.exe register
|
||||
.\EverythingToJpeg.exe unregister
|
||||
.\Everything2Everything.exe register
|
||||
.\Everything2Everything.exe unregister
|
||||
```
|
||||
|
||||
> Windows 11 메인 우클릭 메뉴가 아니라 "추가 옵션 표시(Shift+우클릭)" 메뉴에 노출됩니다. 메인 메뉴 노출은 Phase 2에서 IExplorerCommand + MSIX 로 추가 예정.
|
||||
> Windows 11 기본 우클릭에서는 **추가 옵션 표시(Shift+우클릭)** 안에 노출됩니다. 메인 메뉴 노출은 MSIX + IExplorerCommand DLL이 필요합니다 — `packaging/BuildAndSign.ps1` 참고.
|
||||
|
||||
### 3) 사용
|
||||
|
||||
- 파일 우클릭 → "추가 옵션 표시" → **JPEG로 빠른 변환** 또는 **JPEG로 변환…**
|
||||
- 또는 메인 창에 파일/폴더를 끌어다 놓기
|
||||
#### 우클릭 카스케이드
|
||||
파일 우클릭 → **Everything2Everything으로 변환** → 서브메뉴에서 출력 형식 선택. 각 입력의 매트릭스에 따라 가능한 출력만 표시됩니다.
|
||||
|
||||
## 지원 현황
|
||||
| 입력 → 노출되는 서브메뉴 항목 |
|
||||
|---|
|
||||
| `.png` → JPEG · WebP · AVIF · GIF · TIFF · BMP · 변환… |
|
||||
| `.heic` → JPEG · PNG · WebP · AVIF · GIF · TIFF · BMP · 변환… |
|
||||
| `.pdf` → JPEG · PNG · WebP · AVIF · TIFF · BMP · 변환… |
|
||||
| `.docx` → PDF · JPEG · PNG · WebP · AVIF · TIFF · BMP · 변환… |
|
||||
| `.html` → PDF · JPEG · PNG · WebP · AVIF · TIFF · BMP · 변환… |
|
||||
|
||||
| 형식 | 상태 | 참고 |
|
||||
|---|---|---|
|
||||
| PNG · BMP · JPEG · WebP · AVIF · PSD · TIFF · GIF · RAW(NEF/CR2/CR3/ARW/DNG/RAF/ORF/RW2/SRW/PEF) | ✅ 준비됨 | Magick.NET 14.x |
|
||||
| HEIC · HEIF | ✅ 준비됨 | PhotoSauce + libheif 디코드 |
|
||||
| PDF | ✅ 준비됨 | PDFtoImage(PDFium) |
|
||||
| HTML · HTM | ✅ 준비됨 | WebView2 헤드리스 + CDP `Page.captureScreenshot` 풀페이지 |
|
||||
| DOCX · DOC | ⚙ 외부 도구 필요 | Microsoft Word 또는 LibreOffice 자동 감지 |
|
||||
| HWP · HWPX | ⚙ 외부 도구 필요 | LibreOffice + [H2Orestart](https://github.com/ebandal/H2Orestart) 확장 |
|
||||
"변환…" 항목은 메인 창을 띄워 사이드바에서 출력 형식 ComboBox로 직접 선택할 수 있습니다.
|
||||
|
||||
#### 메인 창
|
||||
파일을 드래그 & 드롭하거나 Ctrl+O. 사이드바의 **TARGET FORMAT** ComboBox는 **큐의 모든 파일이 변환 가능한 출력의 교집합**만 보여줍니다 (이종 입력을 섞으면 자동 필터링).
|
||||
|
||||
#### CLI
|
||||
|
||||
```powershell
|
||||
# <ext>로 변환 (배치 가능)
|
||||
.\Everything2Everything.exe to png photo.heic shot.jpg banner.webp
|
||||
.\Everything2Everything.exe to pdf doc.docx report.html
|
||||
.\Everything2Everything.exe to webp *.png
|
||||
|
||||
# 빠른 변환 (기본 출력 .jpg, 컨텍스트 메뉴 호환)
|
||||
.\Everything2Everything.exe quick photo.heic
|
||||
|
||||
# 메인 창에서 출력 형식 선택
|
||||
.\Everything2Everything.exe dialog photo.heic
|
||||
|
||||
# 진단
|
||||
.\Everything2Everything.exe diagnose
|
||||
```
|
||||
|
||||
## 외부 도구 의존성
|
||||
|
||||
| 변환 | 필요 도구 |
|
||||
|---|---|
|
||||
| 모든 이미지 ↔ 이미지, RAW/PSD 디코딩 | (내장) Magick.NET 14 |
|
||||
| HEIC/HEIF 디코딩 | (내장) PhotoSauce + libheif |
|
||||
| PDF ↔ 이미지 | (내장) PDFtoImage(PDFium) |
|
||||
| HTML → 이미지/PDF | Microsoft Edge **WebView2 Runtime** (Win11 기본 포함) |
|
||||
| DOCX/DOC → PDF/이미지 | **Microsoft Word** 또는 **LibreOffice** (자동 감지) |
|
||||
| HWP/HWPX → PDF/이미지 | **LibreOffice** + [**H2Orestart**](https://github.com/ebandal/H2Orestart) 확장 |
|
||||
|
||||
메인 창 시작 시 가용성을 자동 점검해 사이드바에 안내하고, 미설치 도구는 다이얼로그에서 다운로드 링크를 제공합니다.
|
||||
|
||||
## 기술 스택
|
||||
|
||||
- **.NET 9 + WPF**, Windows 10.0.19041.0+
|
||||
- UI: **WPF-UI 4.3** (Win11 Fluent 2 — Mica 백드롭, Segoe UI Variable 타입 램프)
|
||||
- 변환 엔진: Magick.NET, PDFtoImage, PhotoSauce.MagicScaler + Libheif
|
||||
- UI: **WPF-UI 4.3** (Win11 Fluent 2)
|
||||
- 변환 엔진: Magick.NET, PDFtoImage, PhotoSauce.MagicScaler + Libheif, WebView2 (CDP)
|
||||
|
||||
## 로드맵
|
||||
## 아키텍처
|
||||
|
||||
| 단계 | 상태 | 내용 |
|
||||
|---|---|---|
|
||||
| Phase 1 | ✅ | 레지스트리 컨텍스트 메뉴 (Win11 "추가 옵션 표시"), 핵심 변환, Fluent UI |
|
||||
| Phase 2 | ✅ | C++ IExplorerCommand DLL + MSIX Sparse Package |
|
||||
| Phase 3 | ✅ | HTML(WebView2), HWP/HWPX(LibreOffice + H2Orestart) 실구현 |
|
||||
| Phase 4 | ✅ | **자체 서명 MSIX 자동화** — `packaging/BuildAndSign.ps1` 한 방으로 인증서 생성 + 서명 + 패키지 |
|
||||
| Phase 5 | ✅ | GitHub 리모트 + Actions 릴리즈 워크플로 |
|
||||
| Phase 6 | ✅ | Past Results 영구 저장 (`%LocalAppData%\EverythingToJpeg\history.jsonl`) |
|
||||
| Phase 7 | ✅ | 단축키 (Ctrl+O 추가, Ctrl+Enter 변환, Esc 닫기, F5 새로고침), 코드 정리 |
|
||||
| Phase 8 | ✅ | 시작 시 Provider 가용성 자동 체크, 사이드바에 외부 도구 필요 안내 |
|
||||
```
|
||||
입력 파일 → ProviderRegistry.TryGet(input ext, output ext)
|
||||
↓
|
||||
(input, output) → IConverterProvider 매트릭스 인덱스
|
||||
↓
|
||||
provider.ConvertAsync(source, outDir, outExt, options, ...)
|
||||
```
|
||||
|
||||
핵심 추상화:
|
||||
- `ConversionPair(InputExtension, OutputExtension)` — 단방향 쌍
|
||||
- `ProviderCapability.SupportedConversions: IReadOnlyList<ConversionPair>`
|
||||
- `ProviderRegistry` — `Dictionary<(input, output), Provider>` 매트릭스 인덱싱 + `OutputsForFile()` 쿼리
|
||||
- `ConversionEngine.ConvertOneAsync(source, outputExt, options)` — 동일 입출력 자동 skip + 출력 ext 기반 서브폴더 suffix(`<base>_png/`, `<base>_pdf/`)
|
||||
- `ConvertOptions` — 형식별 sub-record (`Jpeg.Quality`, `Webp.Lossless`, `Avif.Speed`, `PdfRender.Dpi`, `HtmlRender.FullPage` 등)
|
||||
|
||||
## 키보드 단축키
|
||||
|
||||
|
|
@ -80,51 +132,54 @@ dotnet publish src\EverythingToJpeg.App\EverythingToJpeg.App.csproj `
|
|||
| Ctrl+Enter | Process Queue (변환 시작) |
|
||||
| Esc | 창 닫기 |
|
||||
| F5 | 통계 새로고침 |
|
||||
| Active Queue 행 클릭 | 우측 Preview에 즉시 표시 |
|
||||
| Past Results 행 클릭 | 원본 파일이 있으면 Preview 표시 |
|
||||
|
||||
## 두 가지 사용 방식
|
||||
|
||||
### A) Portable EXE — 가장 가벼움 (Phase 1)
|
||||
### A) Portable EXE — 가장 가벼움
|
||||
- `dotnet publish` 산출물 그대로 사용
|
||||
- 우클릭 → **추가 옵션 표시** → "JPEG로 빠른 변환" / "JPEG로 변환…"
|
||||
- 우클릭 → **추가 옵션 표시** → "Everything2Everything으로 변환" → 카스케이드 서브메뉴
|
||||
- 인증서·서명 불필요
|
||||
|
||||
### B) MSIX 패키지 — Win11 메인 메뉴 노출 (Phase 2)
|
||||
- `packaging/BuildMsix.ps1` 로 MSIX 빌드
|
||||
### B) MSIX 패키지 — Win11 메인 메뉴 노출
|
||||
- `packaging/BuildMsix.ps1`로 MSIX 빌드
|
||||
- 자체 서명 인증서를 `LocalMachine\TrustedPeople`에 임포트 후 사이드로드
|
||||
- 우클릭 → 바로 메인 메뉴에 항목 노출
|
||||
- 우클릭 → 메인 메뉴 바로 노출 (IExplorerCommand DLL 사용)
|
||||
- 자세한 절차는 [packaging/README.md](packaging/README.md)
|
||||
|
||||
## 프로젝트 구조
|
||||
|
||||
```
|
||||
everythingToJpeg/
|
||||
├── EverythingToJpeg.slnx
|
||||
Everything2Everything/
|
||||
├── Everything2Everything.slnx
|
||||
└── src/
|
||||
├── EverythingToJpeg.Core/ — 변환 엔진, Provider 추상화
|
||||
│ ├── Providers/ — IConverterProvider + Capability 메타데이터
|
||||
│ ├── Converters/ — Magick / Heic / Pdf / Docx / Html / Hwpx
|
||||
│ ├── ConversionEngine.cs
|
||||
│ └── EverythingToJpegBootstrap.cs
|
||||
└── EverythingToJpeg.App/ — WPF + CLI 통합 진입점
|
||||
├── App.xaml(.cs) — CLI 라우터
|
||||
├── Cli/CliRouter.cs — verb: quick / dialog / register / diagnose
|
||||
├── Shell/ContextMenuRegistrar.cs — HKCU 레지스트리 등록
|
||||
└── Views/ — Fluent UI 화면
|
||||
├── Everything2Everything.Core/ — 변환 엔진, Provider 추상화
|
||||
│ ├── Providers/
|
||||
│ │ ├── ConversionPair.cs — (입력ext, 출력ext) 단방향 쌍
|
||||
│ │ ├── ProviderCapability.cs — SupportedConversions + 입출력 헬퍼
|
||||
│ │ ├── ProviderRegistry.cs — N×M 매트릭스 인덱싱
|
||||
│ │ └── IConverterProvider.cs
|
||||
│ ├── Converters/ — Magick / Heic / Pdf / Docx / Html / Hwpx
|
||||
│ ├── ConversionEngine.cs — outputExt 라우팅 + 서브폴더 suffix
|
||||
│ ├── ConvertOptions.cs — 형식별 sub-options
|
||||
│ └── Everything2EverythingBootstrap.cs
|
||||
└── Everything2Everything.App/ — WPF + CLI 통합 진입점
|
||||
├── App.xaml(.cs)
|
||||
├── Cli/CliRouter.cs — verb: to / quick / dialog / register / diagnose
|
||||
├── Shell/ContextMenuRegistrar.cs — HKCU 카스케이드 등록
|
||||
└── Views/ — Fluent UI 화면
|
||||
```
|
||||
|
||||
## Provider 전략 (확장 포인트)
|
||||
## Provider 확장
|
||||
|
||||
새 형식을 지원하려면 `IConverterProvider`를 구현하고 `EverythingToJpegBootstrap.CreateDefault()`에 등록합니다. `ProviderCapability`에 다음을 명시하세요:
|
||||
새 변환 쌍을 추가하려면 `IConverterProvider`를 구현하고 `Everything2EverythingBootstrap.CreateDefault()`에 등록합니다. `ProviderCapability.SupportedConversions`에 (입력ext, 출력ext) 쌍 리스트를 정의하면 `ProviderRegistry`가 매트릭스 인덱스에 자동 편입하며, 컨텍스트 메뉴 카스케이드 + 메인 창 ComboBox에 자동 반영됩니다.
|
||||
|
||||
- `Status` — `Available` / `Preview` / `RequiresExternal` / `ComingSoon` / `Disabled`
|
||||
- `Extensions` — 자동 라우팅 + 컨텍스트 메뉴 등록 키
|
||||
- `ExternalDependencies` — UI에 자동 노출되는 외부 도구
|
||||
- `RoadmapNote` — 사용자에게 보여줄 향후 계획
|
||||
|
||||
`ComingSoon` 상태는 메인 창의 "지원 형식" 섹션에 자동 노출되지만 컨텍스트 메뉴 등록에서는 자동 제외됩니다.
|
||||
```csharp
|
||||
// 매트릭스 헬퍼 — 모든 입력 × 모든 출력 카르테시안 곱
|
||||
SupportedConversions: ProviderCapability.PairsFromMatrix(
|
||||
new[] { ".png", ".jpg", ".webp" },
|
||||
new[] { ".png", ".jpg", ".pdf" }),
|
||||
```
|
||||
|
||||
## 라이선스
|
||||
|
||||
MIT (예정).
|
||||
MIT.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue