Plugin per Adobe Lightroom Classic che individua le immagini danneggiate del catalogo e le sostituisce con il file omonimo trovato in una cartella scelta dall'utente.
File > Plug-in Manager > Aggiungi e seleziona la cartella LrDamaged.lrdevplugin.
Uso: Libreria > Plug-in Extras > Trova e sostituisci immagini danneggiate...
- Scansione (foto selezionate o intero catalogo). Una foto è "danneggiata" se il file è mancante, vuoto o < 1 KB, ha header non valido (JPEG/PNG/TIFF/RAW/HEIC/RAF), è un JPEG/PNG troncato oppure ha la coda azzerata.
- Ricerca e riconoscimento: la cartella scelta viene indicizzata ricorsivamente; si cercano i file con lo
stesso nome (case-insensitive) e integri. Ogni candidato viene verificato così:
- EXIF (lettore in Lua puro per JPEG, TIFF e RAW basati su TIFF come CR2/NEF/ARW/DNG/ORF/RW2/PEF, più RAF): data di scatto, marca, modello, seriale, obiettivo, ISO, focale, diaframma, tempo, confrontati con i dati del catalogo. Un dato diverso scarta il candidato; la sola data diversa lo declassa a confidenza bassa. Confidenza alta = data + almeno altri 2 dati coincidenti; media = pochi dati coincidenti.
- Se l'EXIF manca o è insufficiente: hash percettivo (aHash 8x8, confronto di Hamming su 4 rotazioni) tra l'anteprima di Lightroom e l'anteprima JPEG incorporata nel candidato. Si decodificano solo i coefficienti DC dei blocchi 8x8 (niente IDCT), quindi su una miniatura costa pochi millisecondi. Distanza <= 10/64 = media, <= 18 = bassa (es. foto ritagliata/modificata), oltre = scartato.
- Se non è possibile nemmeno questo: solo nome file, confidenza bassa. Tra più candidati vince la confidenza più alta, poi il file più grande. Non supportati per EXIF/anteprima: CR3, HEIC (ricadono sul solo nome). 2b. Conferma: prima di toccare qualsiasi file compare una finestra a due colonne (originale | sostituto, con anteprime, motivo e confidenza), con "seleziona/deseleziona tutto" e una casella per ogni riga. Le corrispondenze di confidenza bassa partono deselezionate.
- Sostituzione: il file danneggiato viene spostato in
_lrdamaged_backupaccanto all'originale, il sostitutivo viene copiato nello stesso percorso e verificato (rollback automatico in caso di errore). - Catalogo invariato: la voce di catalogo non viene rimossa né reimportata, quindi metadati, date,
sviluppo, collezioni, pile e copie virtuali restano identici; cambia solo il file master sul disco.
Le foto sostituite vengono aggiunte alla collezione
LR Damaged - sostituite: selezionale e usaLibreria > Anteprime > Crea anteprime in formato standardper rigenerare le anteprime. Non usareLeggi metadati dal file(sovrascriverebbe i metadati del catalogo con quelli del sostituto). - Un log viene scritto in
Documenti/LrDamaged_<data>.txt.
Nulla viene modificato finché non confermi nella finestra di riepilogo; anche le righe non approvate finiscono nel log.
Estensioni controllate (header + coerenza dei dati dichiarati): 3FR ARI ARW BAY CAP CR2 CR3 CRW DCR DCS DNG EIP ERF FFF GPR IIQ K25 KDC MEF MOS MRW NEF NRW ORF PEF PTX RAF RAW RW2 RWL RWZ SRF SR2 SRW X3F TIF/TIFF, più JPEG, PNG e HEIC.
- Troncamento RAW: per i RAW basati su TIFF si confrontano strip/tile/anteprime dichiarati negli IFD con la
dimensione reale del file; per CR3 si controllano i box ISO-BMFF di primo livello (es.
mdatoltre la fine). - EXIF + anteprima incorporata letti da: formati TIFF-based (Canon CR2, Nikon NEF/NRW, Sony ARW/SR2/SRF, Pentax PEF/DNG, Panasonic RW2/RWL, Olympus ORF, Samsung SRW, Hasselblad 3FR/FFF, Phase One IIQ, Epson ERF, Mamiya MEF, Kodak DCR/KDC, GoPro GPR...), Fujifilm RAF, Canon CR3, Minolta MRW, JPEG.
- Solo header (niente EXIF/hash, ricade sul nome): Canon CRW, Sigma X3F, HEIC.
- Verificato con file sintetici costruiti a mano (TIFF/NEF, CR3, MRW, JPEG), non con RAW reali di fotocamera: alcune varianti di fabbricante potrebbero comportarsi diversamente.
Ogni chiamata dell'SDK è stata confrontata con il riferimento ufficiale (Lightroom SDK 5/6, copia in
giovariot/api-references, cartella lightroom-sdk).
- Verificate nel riferimento:
LrApplication.activeCatalog;catalog:getTargetPhotos/getAllPhotos/withWriteAccessDo/createCollection(nome, parent, canReturnPrior);collection:addPhotos(ammesso nello stesso gate che crea la collezione);photo:getRawMetadata(path,dateTimeOriginalISO8601,dateTimeISO8601,isoSpeedRating,focalLength,aperture= denominatore f,shutterSpeed= secondi);photo:getFormattedMetadata(cameraMake,cameraModel,cameraSerialNumber,lens);photo:requestJpegThumbnail(w, h, callback);LrFileUtils.exists/fileAttributes/move/copy/delete/chooseUniqueFileName/createAllDirectories/recursiveFiles;LrPathUtils.leafName/parent/child/extension/getStandardFilePath('documents'|'temp');LrProgressScope(title,functionContext,setPortionComplete,setCaption,isCanceled,done);LrDialogs.runOpenPanel/presentModalDialog/message;LrBinding.makePropertyTable+addObserver;LrDate.currentTime/timeToUserFormat;LrTasks.startAsyncTask/yield/sleep/pcall;LrFunctionContext.callWithContext;LrView.osFactory/bindconcolumn row static_text checkbox radio_button push_button separator spacer picture catalog_photo scrolled_view. - Correzioni emerse dalla verifica:
LrTasks.pcallal posto dipcallattorno al codice che cede il controllo (ilpcallstandard non può attraversare gli yield);recursiveFilessenzabreak/returnnel ciclo (lascerebbe aperto l'handle);createAllDirectoriesritornatruesolo se ha creato qualcosa, quindi l'esito si controlla conexists; diaframma e tempo grezzi sono numeri normali, non APEX; rimossoLrProgressScope:setTitle(non esiste). - Non coperto dal riferimento: le chiavi di
Info.lua(LrSdkVersion,LrToolkitIdentifier,LrPluginName,LrLibraryMenuItems,VERSION) sono documentate a parte; il valore dif:pictureè descritto come risorsa del plugin: il plugin gli passa il percorso di un file temporaneo e, se Lightroom non lo accetta, l'anteprima del sostituto non appare (il resto funziona).
- I controlli sono a livello di file, non decodificano i pixel: un RAW corrotto a metà ma con header e coda integri non viene rilevato.
- Il sostituto dovrebbe avere stesse dimensioni e orientamento dell'originale, altrimenti ritaglio e sviluppo salvati nel catalogo potrebbero non combaciare (il plugin non lo verifica).
- Il codice non è stato eseguito dentro Lightroom Classic (non disponibile nell'ambiente di sviluppo):
provarlo prima su una copia del catalogo. Il decoder DC e il lettore EXIF sono stati verificati con Lua 5.1
fuori da Lightroom; interfaccia,
requestJpegThumbnaile i nomi dei metadati dell'SDK vanno verificati in Lightroom. - Se in Lightroom hai modificato la data di scatto di una foto, la data non combacerà con l'EXIF del file.
- L'hash dell'anteprima può fallire su foto molto ritagliate o convertite in B/N (finiscono come bassa).