Photo2Mac

Editor de imagini nativ macOS cu flux complet nedistructiv. Editarile traiesc pe un stack salvat ca metadata XMP in interiorul imaginii.

~1.7 MB · macOS 14+ · Apple Silicon · GPL-2.0

De ce Photo2Mac?

Majoritatea editoarelor de imagini pe Mac fie commit-uiesc pixelii la fiecare ajustare (Preview, majoritatea app-urilor gratuite), fie ascund editarile intr-o librarie proprietara (Photos, Lightroom). Photo2Mac sta in golul dintre ele: fiecare editare e doar o intrare intr-un EditStack randat live de Core Image. Nimic nu se scrie pana la Save, iar cand salvezi, stack-ul calatoreste in interiorul fisierului salvat ca XMP — deci redeschiderea aceluiasi fisier in Photo2Mac restaureaza editarile si iti permite sa continui sa le ajustezi, la nesfarsit.

Alte aplicatii vad doar pixelii randati. Photo2Mac e singura care cunoaste reteta.

Functionalitati

Instalare

  1. Descarca cel mai recent .dmg de la pagina de release-uri.
  2. Deschide .dmg, trage Photo2Mac.app in shortcut-ul Applications.
  3. Pentru ca bundle-ul e ad-hoc signed (inca nu exista Apple Developer ID platit), Gatekeeper va refuza sa-l deschida la prima lansare. Sterge flag-ul de carantina o singura data:
    xattr -dr com.apple.quarantine /Applications/Photo2Mac.app
  4. Deschide Photo2Mac.app din /Applications si foloseste ⌘O pentru a deschide o imagine, sau trage una peste fereastra.
Fara Homebrew. Fisierul .dmg are circa 1.7 MB si depinde doar de framework-urile sistem Apple. Detalii pentru build din sursa sunt pe GitHub.

Stiva de editari XMP

Photo2Mac e nedistructiv: fiecare ajustare e un element din EditStack, randat live de Core Image. La Save, scrie pixelii randati si incorporeaza EditStack-ul ca metadata XMP in fisier. Redeschizi acelasi fisier in Photo2Mac si stiva revine ca s-o editezi mai departe; alte aplicatii vad doar pixelii randati.

Mai jos e formatul pe disc, ca sa-l poti citi sau produce din alte tool-uri.

Namespace

Aceeasi proprietate e scrisa in JPEG (APP1), PNG (iTXt XML:com.adobe.xmp), HEIC (meta box) si TIFF (tag 700) prin ImageIO de la Apple.

JSON-ul EditStack

{
  "rotateDegrees": 0,        // sens orar, pas 0.01°
  "flipHorizontal": false,
  "flipVertical": false,
  "crop": null,              // sau { x, y, width, height } normalizate 0..1
  "adjustments": {
    "brightness": 0.0,       // -1 .. 1   -> CI -0.5 .. 0.5
    "contrast":   0.0,       // -1 .. 1   -> CI  0.5 .. 1.5
    "saturation": 0.0,       // -1 .. 1   -> CI  0.0 .. 2.0
    "exposure":   0.0        // -3 .. 3 EV (CIExposureAdjust)
  }
}

Ordinea de randare e fixa: flipH → flipV → rotate → crop → adjustments — geometria intai (ca crop sa lucreze pe cadrul rotit pe care il vezi), ajustarile de pixel la final.

Se mai scrie: tag-uri standard

Ca sa vada orice reader XMP — Inspector-ul din Preview, Metapho, Adobe Bridge, exiftool, mdls, Get Info din Finder — ce s-a intamplat cu fisierul, langa p2m:editStack se scriu si:

Toate trei sunt mereu in engleza, indiferent de limba UI-ului Photo2Mac — metadata din fisier e citita de tool-uri si oameni de pretutindeni, deci ramane locale-independent.

Exemplu: rotire + crop

Indreptare 2.5° in sens antiorar, apoi crop la 90%×80% central:

{
  "rotateDegrees": -2.5,
  "flipHorizontal": false,
  "flipVertical": false,
  "crop": { "x": 0.05, "y": 0.10, "width": 0.90, "height": 0.80 },
  "adjustments": {
    "brightness": 0, "contrast": 0, "saturation": 0, "exposure": 0
  }
}

tiff:ImageDescription corespunzator:

Photo2Mac 0.1.0 — rotate -2.50°, crop 90%×80% at (5%, 10%)

Inspectare din linia de comanda

Cu exiftool:

# Toate campurile XMP, inclusiv p2m
exiftool -XMP:all -G photo.jpg

# Doar JSON-ul cu stiva de editari
exiftool -XMP-p2m:editStack -b photo.jpg | jq

# Rezumat human-readable
exiftool -ImageDescription -CreatorTool photo.jpg

Referinta completa, inclusiv politica de stabilitate (1.0/ din URI = versiunea de schema): docs/XMP.md din repo.

Changelog

Oglindeste exact release-urile de pe GitHub. Cele mai noi sus.

v0.2.0-alpha · 2026-05-28

Fereastra Help, panou About, documentatie XMP si asocieri tipuri de fisiere.

Nou

  • Panou About custom cu autor, copyright si link-uri clicabile GitHub / Issues / email.
  • Fereastra Help (⌘?) cu sectiuni pentru overview, cum incepi, tool-uri, save/persistare, formatul XMP al stivei de editari (namespace, exemplu JSON, ordine de randare), scurtaturi, sfaturi si limitari. Se deschide la 740×820 lizibil, nu la marimea colapsata default macOS.
  • Documentatie XMP edit-stack — referinta completa la docs/XMP.md: namespace-ul p2m:, schema JSON EditStack (rotateDegrees, flipH/V, crop, adjustments) cu mapare Core Image, ordine de randare, cele trei tag-uri standard scrise alaturi (xmp:CreatorTool, tiff:ImageDescription, dc:description), exemple si snippets exiftool.
  • Asocieri tipuri de fisiere in Settings — seteaza Photo2Mac ca editor default pentru JPEG / PNG / HEIC / HEIF / TIFF, individual sau toate odata. Scrie in aceeasi baza LaunchServices folosita de Finder Get Info > Open With > Change All...

Fix-uri

  • Help-ul nu se mai deschide colapsat doar la title bar la primul launch.
v0.1.0-alpha · 2026-05-28 — Primul release public

Primul release public.

Ce functioneaza

  • Pipeline nedistructiv cu randare live Core Image (Metal-backed).
  • Crop cu 8 handle-uri (colturi + muchii), picker raport (Original, 1:1, 4:3, 3:2, 16:9, ..., Liber), cursoare directionale de resize la hover.
  • Rotate cu preseturi ±90°, slider 0.01°, camp text pentru unghi precis; Flip H / V.
  • Tune — luminozitate / contrast / saturatie / expunere cu histograma live (Luminance / RGB / R / G / B).
  • Lista editari popover in toolbar cu revert per rand.
  • Save (⌘S) suprascrie fisierul deschis cu pixelii randati + EditStack XMP embedat; Save As (⌘⇧S) cere o destinatie.
  • Autosave invizibil sub ~/Library/Application Support/Photo2Mac/ deci editarile nesalvate supravietuiesc inchiderii unui tab.
  • Ecran de bun venit cu fisiere recente; Vizualizator metadata cu EXIF + status XMP Photo2Mac (JSON raw optional).
  • UI bilingv (engleza default + romana), schimbabil in Setari; fisierele salvate stocheaza intotdeauna metadata doar in engleza.
  • Panou About custom + fereastra Help (⌘?).
  • Tab-uri, meniu Open Recent, Undo / Redo (⌘Z / ⌘⇧Z) cu drag-uri de slider colapsate.

Ce nu e inca

Intrebari frecvente

Photo2Mac este gratuit?

Da. Photo2Mac este gratuit si open source sub licenta GPL-2.0-or-later. Nu exista tier platit, fara abonament, fara telemetrie. Sursa si .dmg sunt ambele pe GitHub.

Ce inseamna «nedistructiv» aici?

Pixelii originali ai fisierului tau nu sunt atinsi pana cand nu apesi Save. Fiecare ajustare — crop, rotate, flip, luminozitate, contrast, saturatie, expunere — traieste pe un EditStack randat live de Core Image. Cand salvezi, Photo2Mac scrie pixelii randati si embedeaza EditStack ca metadata XMP, deci redeschiderea aceluiasi fisier restaureaza stack-ul si iti permite sa continui editarea.

Ce formate citeste si scrie Photo2Mac?

JPEG, PNG, HEIC si TIFF. Suportul RAW e pe roadmap. Metadata XMP e embedata in toate cele patru formate de output via ImageIO.

Functioneaza pe Mac-uri Apple Silicon?

Da. Fisierul .dmg e build-uit pentru Apple Silicon (arm64) si necesita macOS 14 Sonoma sau mai nou. Codebase-ul e universal si poate fi compilat si pe Intel din sursa.

De ce arata macOS un avertisment Gatekeeper la prima deschidere?

Pentru ca bundle-ul e ad-hoc signed — inca nu exista Apple Developer ID platit. Sterge flag-ul de carantina o singura data cu:

xattr -dr com.apple.quarantine /Applications/Photo2Mac.app

Apoi deschide aplicatia normal. Notarization-ul (care elimina avertismentul permanent) e planificat odata ce proiectul are un Developer ID.

Photo2Mac are nevoie de Homebrew sau alte dependinte?

Nu. Fisierul .dmg e self-contained (~1.7 MB) si depinde doar de framework-urile sistem Apple (Core Image, ImageIO, AppKit, SwiftUI). Trage in Applications si ruleaza.

Licenta si credite

Photo2Mac e lansat sub GPL-2.0-or-later. Iconitele UI sunt un subset al setului de iconite Phosphor (MIT) via Iconify.

Feedback

Bug-uri si cereri de functionalitati: issue tracker.
Contact direct: razvan@cremenescu.ro.