private bool creaMiniaturaMaschera(string nomeFileMaschera, string nomeFileMiniatura) { bool esiste = false; if (!File.Exists(nomeFileMiniatura)) { try { IGestoreImmagineSrv gis = LumenApplication.Instance.getServizioAvviato <IGestoreImmagineSrv>(); IImmagine immagineMaschera = gis.load(nomeFileMaschera); IImmagine immagineMiniatura = gis.creaProvino(immagineMaschera, 80); // creo una immagine più piccola gis.save(immagineMiniatura, nomeFileMiniatura); esiste = true; } catch (Exception ee) { _giornale.Error("Non riesco a creare la miniatura della maschera : " + nomeFileMaschera, ee); } } else { esiste = true; } return(esiste); }
/// <summary> /// Creo il Provino, e/o la Risultante di una foto e scrivo l'immagine su disco nel file indicato /// </summary> /// <param name="nomeFileSorgente">E' il nome del file della foto vera, grande</param> /// <param name="foto"></param> private static void creaCacheFotoSuDisco(Fotografia foto, IdrataTarget quale, string nomeFileOriginale) { _giornale.Debug("Creo provino foto n." + foto.numero + " target=" + quale); Debug.Assert(quale == IdrataTarget.Provino || quale == IdrataTarget.Risultante); IGestoreImmagineSrv gis = LumenApplication.Instance.getServizioAvviato <IGestoreImmagineSrv>(); IFotoRitoccoSrv fr = LumenApplication.Instance.getServizioAvviato <IFotoRitoccoSrv>(); // Carico l'immagine grande originale (solo la prima volta) bool caricataOrig = false; if (foto.imgOrig == null) { _giornale.Debug("carico immagine originale da disco: " + nomeFileOriginale); foto.imgOrig = gis.load(nomeFileOriginale); caricataOrig = true; } // carico eventuali correzioni CorrezioniList correzioni = null; if (foto.correzioniXml != null) { try { correzioni = SerializzaUtil.stringToObject <CorrezioniList>(foto.correzioniXml); } catch (Exception ee) { // Se ci fossero inciampi con le correzioni, preferisco perderle che far saltare tutto. // Non dovrebbe mai capitare. _giornale.Error("Deserializza correzioni foto = " + foto.id, ee); } } // Se devo crere il provino ma la foto contiene la correzione di Zoom, // devo passare dalla foto grande, altrimenti perde di qualità bool devoPassareDallaGrande = false; if (quale == IdrataTarget.Risultante) { devoPassareDallaGrande = true; } if (correzioni != null && correzioni.Contains(typeof(Zoom))) { devoPassareDallaGrande = true; } // Se richiesto nella configurazione, scrivo direttamente sul provino le righe tratteggiate di rispetto area stampabile bool aggiungiCorrezioneAreaRispetto = false; if (Configurazione.UserConfigLumen.imprimereAreaDiRispetto) { if (quale == IdrataTarget.Provino) { if (correzioni == null) { correzioni = new CorrezioniList(); } if (!correzioni.Contains(typeof(AreaRispetto))) { aggiungiCorrezioneAreaRispetto = true; } } } // Cancello il file Risultante da disco perchè tanto sta per cambiare. IImmagine immagineDestinazione = null; foto.imgRisultante = null; string nomeFileRisultante = PathUtil.nomeCompletoFile(foto, IdrataTarget.Risultante); if (File.Exists(nomeFileRisultante)) { File.Delete(nomeFileRisultante); } // Eventuale creazione delle cartelle di destinazione (potrebbero non esistere) PathUtil.creaCartellaProvini(foto); PathUtil.creaCartellaRisultanti(foto); // OK partiamo! if (devoPassareDallaGrande) { immagineDestinazione = (IImmagine)foto.imgOrig.Clone(); // creo un duplicato della Originale per poi lavorarci } else { immagineDestinazione = gis.creaProvino(foto.imgOrig); // creo una immagine più piccola } // applico eventuali correzioni if (correzioni != null) { IdrataTarget tempQuale = quale; if (devoPassareDallaGrande && quale == IdrataTarget.Provino) { tempQuale = IdrataTarget.Risultante; } if (aggiungiCorrezioneAreaRispetto && tempQuale == IdrataTarget.Provino) { correzioni.Add(areaRispetto); } immagineDestinazione = fr.applicaCorrezioni(immagineDestinazione, correzioni, tempQuale); // NO : non funziona sempre bene. // Se sto facendo un provino che prevede lo zoom, devo passare dalla immagine grande, // quindi sono obbligato a ricalcolare la Risultante e quindi rimpicciolirla. // quindi per essere efficiente, salvo la Risultante che ho già pronta (cosi risparmio tempo dopo) if (devoPassareDallaGrande && quale == IdrataTarget.Provino) { gis.save(immagineDestinazione, nomeFileRisultante); foto.imgRisultante = immagineDestinazione; // Poi la ritaglio per fare il provino buono. immagineDestinazione = gis.creaProvino(immagineDestinazione); // Aggiungo l'area di rispetto al provino if (aggiungiCorrezioneAreaRispetto) { immagineDestinazione = fr.applicaCorrezione(immagineDestinazione, areaRispetto); } } } // Salvo su disco l'immagine di destinazione string nomeFileDest = PathUtil.nomeCompletoFile(foto, quale); gis.save(immagineDestinazione, nomeFileDest); _giornale.Debug("Ho ricreato il file immagine di cache: " + nomeFileDest); // Eventualmente chiudo l'immagine grande se l'avevo aperta io. // Il provino, invece lo lascio aperto (non so se mi causerà problemi di memoria) if (caricataOrig) { AiutanteFoto.disposeImmagini(foto, IdrataTarget.Originale); } // Modifico la foto che mi è stata passata. if (quale == IdrataTarget.Provino) { foto.imgProvino = immagineDestinazione; } if (quale == IdrataTarget.Risultante) { foto.imgRisultante = immagineDestinazione; } }
private void aggiungiImmagineAlCanvas(Canvas canvas, Fotografia foto, double x, double y) { try { // Ricavo l'immagine da stampare IImmagine provino; if (usoGrande) { AiutanteFoto.idrataImmagineDaStampare(foto); provino = AiutanteFoto.idrataImmagineGrande(foto); if (Configurazione.UserConfigLumen.tecSogliaStampaProvini == -3) { IGestoreImmagineSrv g = LumenApplication.Instance.getServizioAvviato <IGestoreImmagineSrv>(); IImmagine provino2 = g.creaProvino(provino, 1000); provino = (IImmagine)provino2.Clone(); ((ImmagineWic)provino).bitmapSource.Freeze(); AiutanteFoto.disposeImmagini(foto, IdrataTarget.Originale); AiutanteFoto.disposeImmagini(foto, IdrataTarget.Risultante); } immaginiPaginaPrecedente.Add(provino); } else { AiutanteFoto.idrataImmaginiFoto(foto, IdrataTarget.Provino); provino = foto.imgProvino; } Image img = new Image(); img.Stretch = Stretch.Uniform; img.StretchDirection = StretchDirection.Both; img.SetValue(Canvas.TopProperty, (Double)(sizeLatoH * (y - 1)) + testataH); img.SetValue(Canvas.LeftProperty, (Double)(sizeLatoW * (x - 1) + margin / 2)); img.Width = sizeLatoW - margin; img.Height = sizeLatoH - margin; img.HorizontalAlignment = HorizontalAlignment.Center; img.VerticalAlignment = VerticalAlignment.Center; if (provino != null) { img.RenderSize = new Size(img.Width, img.Height); // TODO tento di tenere bassa la memoria img.BeginInit(); BitmapSource bs = ((ImmagineWic)provino).bitmapSource; img.Source = bs; img.EndInit(); } canvas.Children.Add(img); } catch (Exception ee) { // Non rilancio l'eccezione perché voglio continuare a stampare _giornale.Error("Impossibile caricare immagime della foto: " + foto, ee); } eventualiStampigli(canvas, x, y, foto); }