示例#1
0
        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);
        }
示例#2
0
        /// <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;
            }
        }
示例#3
0
        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);
        }