void provinatore_ProgressChanged(object sender, ProgressChangedEventArgs e) { Fotografia foto = (Fotografia)e.UserState; bool esistevaRisultante = foto.imgRisultante != null; // Rilascio memoria AiutanteFoto.disposeImmagini(foto, IdrataTarget.Tutte); AiutanteFoto.creaProvinoFoto(foto); // Le due foto grandi le rilascio per non intasare la memoria qualora questo metodo è chiamato più volte AiutanteFoto.disposeImmagini(foto, IdrataTarget.Originale); AiutanteFoto.disposeImmagini(foto, IdrataTarget.Risultante); bool esisteRisultante = foto.imgRisultante != null; // Siccome è molto probabile che venga idratata l'immagine risultante e siccome sono in un loop, // non posso tenere in memoria tanta roba, altrimenti esplode if (esisteRisultante && !esistevaRisultante) { // Significa che l'ho idratata io in questo momento AiutanteFoto.disposeImmagini(foto, IdrataTarget.Risultante); } // Avviso tutti che questa foto è cambiata FotoModificateMsg msg = new FotoModificateMsg(this, foto); pubblicaMessaggio(msg); }
/// <summary> /// Elimina tutte le Correzioni da una foto e quindi ricrea il provino /// </summary> public void tornaOriginale(Fotografia fotografia, bool salvare) { fotografia.correzioniXml = null; // Rimuovo anche eventuale file su disco string nomeFileRis = PathUtil.nomeCompletoRisultante(fotografia); if (File.Exists(nomeFileRis)) { File.Delete(nomeFileRis); } // Rilascio memoria AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Tutte); AiutanteFoto.creaProvinoFoto(fotografia); // Le due foto grandi le rilascio per non intasare la memoria qualora questo metodo è chiamato più volte AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Originale); AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Risultante); if (salvare) { Fotografia f = fotografia; fotografieRepositorySrv.update(ref f, true); fotografieRepositorySrv.saveChanges(); // Persisto nel db le modifiche // Devo informate tutti che questa foto è cambiata FotoModificateMsg msg = new FotoModificateMsg(this, fotografia); pubblicaMessaggio(msg); } }
public void ruotare(IEnumerable <Fotografia> fotografie, int pGradi) { Ruota ruota = new Ruota(pGradi); // Devo informate tutti che queste foto sono cambiate. Preparo il messaggio FotoModificateMsg msg = new FotoModificateMsg(this); foreach (Fotografia f in fotografie) { if (ruota.isAngoloRetto) { autoRuotaSuOriginale(f, ruota); } else { addCorrezione(f, ruota); gestoreImmaginiSrv.salvaCorrezioniTransienti(f); } msg.add(f); } pubblicaMessaggio(msg); }
/// <summary> /// Aggiungo una correzione a quelle già eventualmente presenti sulla foto. /// Se la correzione esiste già, gestisco eventuale somma, oppure rimozione in caso che sia inutile (ininfluente) /// </summary> /// <param name="fotografia">la foto</param> /// <param name="correzione">la correzione da aggiungere</param> public void addCorrezione(Fotografia fotografia, Correzione correzioneNuova, bool salvare) { CorrezioniList correzioni; // Deserializzo la stringa con le eventuali correzioni attuali if (fotografia.correzioniXml == null) { correzioni = new CorrezioniList(); } else { correzioni = SerializzaUtil.stringToObject <CorrezioniList>(fotografia.correzioniXml); } // Alcune correzioni, non devono andare sempre in aggiunta, ma possono sommarsi l'un l'altra. // Per esempio la rotazione. Se ruoto 90° poi altri 90, l'effetto finale è quello di avere una sola da 180° Correzione daSost = null; Correzione vecchia = null; foreach (Correzione c in correzioni) { if (c.isSommabile(correzioneNuova)) { vecchia = c; daSost = c.somma(correzioneNuova); break; } } if (daSost != null) { // Sostituisco la correzione con quella ricalcolata if (daSost.isInutile) { correzioni.Remove(vecchia); } else { correzioni.sostituire(vecchia, daSost); } } else { // Aggiungo in fondo (se la correzione è inutile, allora non aggiungo nulla) if (!correzioneNuova.isInutile) { correzioni.Add(correzioneNuova); } } // Ora serializzo di nuovo in stringa tutte le correzioni fotografia.correzioniXml = SerializzaUtil.objectToString(correzioni); if (salvare) { fotografieRepositorySrv.saveChanges(); // Persisto nel db le modifiche AiutanteFoto.creaProvinoFoto(fotografia); // Devo informare tutti che questa foto è cambiata FotoModificateMsg msg = new FotoModificateMsg(this, fotografia); pubblicaMessaggio(msg); } }