Esempio n. 1
0
        private byte[] getImage(Guid fotografiaId, IdrataTarget quale)
        {
            byte[] bytes = null;

            using (new UnitOfWorkScope()) {
                var srv = LumenApplication.Instance.getServizioAvviato <IEntityRepositorySrv <Fotografia> >();

                Fotografia fotografia = srv.getById(fotografiaId);

                string nomeFileImg;

                // Qui faccio una piccola miglioria: Se l'immagine risultante ha delle correzioni non ancora applicate, le applico adesso.
                if (quale == IdrataTarget.Risultante)
                {
                    nomeFileImg = AiutanteFoto.idrataImmagineDaStampare(fotografia);
                }
                else
                {
                    nomeFileImg = AiutanteFoto.idrataImmaginiFoto(fotografia, quale);
                }

                bytes = File.ReadAllBytes(nomeFileImg);

                AiutanteFoto.disposeImmagini(fotografia, IdrataTarget.Tutte);
            }

            return(bytes);
        }
        /// <summary>
        /// Quando lavoro con una singola foto, se vado sullo schermo del pubblico,
        /// devo fare vedere la foto più bella che ho (cioè quella grande)
        /// Il problema è che la foto grande, potrebbe ancora non essere stata calcolata
        /// </summary>
        /// <param name="fotografia"></param>
        ///
        public void eseguiSnapshotSuFinestraPubblica(Fotografia fotografia, bool forzaAperturaWin)
        {
            // Se la finestra è chiusa e il flag non mi forza l'apertura non faccio niente
            if (!forzaAperturaWin && _snapshotPubblicoWindow == null)
            {
                return;
            }

            FotoDisposeUtils.Instance().DisposeFotografia(fotografia);

            IdrataTarget quale = AiutanteFoto.qualeImmagineDaStampare(fotografia);

            AiutanteFoto.idrataImmagineDaStampare(fotografia);

            IImmagine immagine = AiutanteFoto.getImmagineFoto(fotografia, quale);

            forseApriSnapshotPubblicoWindow();

            snapshotPubblicoViewModel.snapshotImageSource = ((ImmagineWic)immagine).bitmapSource;
        }
        private void viewFotoFullScreen()
        {
            // Qui devo capire quale foto verrà idratata
            IdrataTarget quale = AiutanteFoto.qualeImmagineDaStampare(singolaFotoTarget);

            // Qui idrato
            AiutanteFoto.idrataImmagineDaStampare(singolaFotoTarget);

            // Qui ricavo la foto
            IImmagine img         = AiutanteFoto.getImmagineFoto(singolaFotoTarget, quale);
            var       imageSource = ((ImmagineWic)img).bitmapSource as ImageSource;

            // Qui passo la foto al viewmodel che la deve visualizzare
            PanAndZoomViewModel panZommViewModel = new PanAndZoomViewModel(imageSource);

            // TODO anti-pattern : aprire finestre nel WiewModel.
            //		usare openPopupDialogRequest come già fatto per associazione faccia fotografo
            PanAndZoomWindow w = new Digiphoto.Lumen.UI.PanAndZoom.PanAndZoomWindow();

            w.DataContext = panZommViewModel;
            w.ShowDialog();
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="values">Un array di oggetti cosi: composto:</br>
        ///   indice = 0 : un oggetto Fotografia
        ///   indice = 1 : un viewModel (o una qualsiasi classe) che implementi l'interfaccia IContenitoreGriglia
        /// </param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns>una ImageSource</returns>
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            ImageSource imageSource = null;

            try {
                Fotografia          fotografia           = (Fotografia)values[0];
                IContenitoreGriglia vmContenitoreGriglia = (IContenitoreGriglia)values[1];

                IdrataTarget quale;

                // Se sto visualizzando una sola foto, oppure due affiancate su di una riga .... scelgo alta qualita
                if (vmContenitoreGriglia != null &&
                    richiedeAltaQualita(vmContenitoreGriglia.numRighe, vmContenitoreGriglia.numColonne))
                {
                    // ALTA QUALITA (più lento)
                    quale = AiutanteFoto.qualeImmagineDaStampare(fotografia);
                    AiutanteFoto.idrataImmagineDaStampare(fotografia);
                }
                else
                {
                    // BASSA QUALITA (più veloce)
                    quale = IdrataTarget.Provino;
                }


                IImmagine immagine = AiutanteFoto.getImmagineFoto(fotografia, quale);
                if (immagine != null)
                {
                    imageSource = ((ImmagineWic)immagine).bitmapSource as ImageSource;
                }
            } catch (Exception ee) {
                _giornale.Error("estrazione immagine fallita", ee);
                // Alcune immagini possono essere rovinate o mancanti. Devo proseguire.
                imageSource = null;
            }

            return(imageSource);
        }
Esempio n. 5
0
        /**
         * Attenzione:
         * questo metodo deve ritornare l'esito della stampa, quindi non deve essere asincrono.
         * Deve essere sicronizzato
         */
        public EsitoStampa esegui(LavoroDiStampa lavoroDiStampa)
        {
            LavoroDiStampaFoto _lavoroDiStampa = lavoroDiStampa as LavoroDiStampaFoto;

            _giornale.Debug("Sto per avviare il lavoro di stampa: " + lavoroDiStampa.ToString());

            _conta++;

            try {
                string nomeFileFoto = AiutanteFoto.idrataImmagineDaStampare(_lavoroDiStampa.fotografia);

                // Ricavo l'immagine da stampare
                IImmagine immagine = _lavoroDiStampa.fotografia.imgRisultante != null ? _lavoroDiStampa.fotografia.imgRisultante : _lavoroDiStampa.fotografia.imgOrig;

                // Gestisco una eccezione specifica, in questo modo ho un messaggio chiaro di cosa è andato storto.
                if (immagine == null)
                {
                    throw new FileNotFoundException("fotografia = " + _lavoroDiStampa.fotografia, _lavoroDiStampa.fotografia.nomeFile);
                }

                // Devo clonare l'immagine perché negli atri thread potrebbero eseguire delle dispose che me la svuotano
                using (IImmagine immagineDaStampare = (IImmagine)immagine.Clone()) {
                    // TODO BLUCA provo a duplicare l'immagine per evitare l'errore che è di proprietà del thread chiamante.
                    // BitmapSource bmp = new WriteableBitmap( ((ImmagineWic)immagineDaStampare).bitmapSource );
                    // bmp.Freeze();

                    BitmapSource bmp = ((ImmagineWic)immagineDaStampare).bitmapSource;

                    var         match = Regex.Match(lavoroDiStampa.param.nomeStampante, @"(?<machine>\\\\.*?)\\(?<queue>.*)");
                    PrintServer ps1   = null;
                    if (match.Success)
                    {
                        // Come print-server uso il server di rete
                        ps1 = new PrintServer(match.Groups["machine"].Value);
                    }
                    else
                    {
                        // Come print-server uso me stesso
                        ps1 = new PrintServer();
                    }
                    using ( ps1 ) {
                        PrintQueue coda = null;
                        if (match.Success)
                        {
                            coda = ps1.GetPrintQueue(match.Groups["queue"].Value);
                        }
                        else
                        {
                            coda = ps1.GetPrintQueue(lavoroDiStampa.param.nomeStampante);
                        }

                        // Ricavo la coda di stampa (cioè la stampante) e le sue capacità.
                        using ( coda ) {
                            PrintCapabilities capabilities = null;
                            try {
                                capabilities = coda.GetPrintCapabilities();
                            } catch (Exception) {
                                // Le stampanti shinko non supportano
                            }

                            // Imposto la stampante (così che mi carica le impostazioni)
                            PrintDialog dialog = new PrintDialog();
                            dialog.PrintQueue = coda;

                            Size areaStampabile = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);

                            // Imposto qualche attributo della stampa
                            bool piuRealistaDelRe = false;
                            if (piuRealistaDelRe)                                // Meglio non essere più realisti del re.
                            {
                                dialog.PrintTicket.OutputQuality       = OutputQuality.Photographic;
                                dialog.PrintTicket.PhotoPrintingIntent = PhotoPrintingIntent.PhotoBest;
                            }

                            // Compongo il titolo della stampa che comparirà nella descrizione della riga nello spooler di windows
                            StringBuilder titolo = new StringBuilder();
                            titolo.AppendFormat("foto N.{0} Oper={1} gg={2}",
                                                _lavoroDiStampa.fotografia.etichetta,
                                                _lavoroDiStampa.fotografia.fotografo.iniziali,
                                                String.Format("{0:dd-MMM}", _lavoroDiStampa.fotografia.dataOraAcquisizione));
#if DEBUG
                            titolo.Append(" #");
                            titolo.Append(DateTime.Now.ToString("mmssss"));                                  // Uso un numero univoco per evitare doppioni per il doPdf altrimenti mi chiede sempre di sovrascrivere
#endif
                            // Eventuale rotazione dell'orientamento dell'area di stampa
                            // Devo decidere in anticipo se la stampante va girata. Dopo che ho chiamato Print non si può più fare !!!
                            bool _ruotareStampante = false;
                            if (_lavoroDiStampa.param.autoRuota)
                            {
                                if (!ProiettoreArea.isStessoOrientamento(areaStampabile, immagineDaStampare))
                                {
                                    _ruotareStampante = true;
                                }
                            }

                            if (_ruotareStampante)
                            {
                                if (capabilities != null && capabilities.PageOrientationCapability.Contains(PageOrientation.Landscape) && capabilities.PageOrientationCapability.Contains(PageOrientation.Portrait))
                                {
                                    // tutto ok
                                    dialog.PrintTicket.PageOrientation = (dialog.PrintTicket.PageOrientation == PageOrientation.Landscape ? PageOrientation.Portrait : PageOrientation.Landscape);
                                }
                                else
                                {
                                    _giornale.Debug("La stampante " + lavoroDiStampa.param.nomeStampante + " non accetta cambio orientamento landscape/portrait");
                                }

                                // Quando giro la stampante, non mi si girano anche le dimensioni. Ci penso da solo.
                                areaStampabile = ProiettoreArea.ruota(areaStampabile);
                            }

                            //
                            // ----- gestisco il numero di copie
                            //
                            int cicliStampa = 1;
                            if (lavoroDiStampa.param.numCopie > 1)
                            {
                                // Se la stampante gestisce le copie multiple, faccio un invio solo.
                                if (capabilities != null && capabilities.MaxCopyCount >= lavoroDiStampa.param.numCopie)
                                {
                                    dialog.PrintTicket.CopyCount = lavoroDiStampa.param.numCopie;
                                }
                                else
                                {
                                    cicliStampa = lavoroDiStampa.param.numCopie;
                                }
                            }

                            //
                            // ----- Preparo la realizzazione grafica da mandare in output
                            //

                            // Ora creo il documento che andrò a stampare.
                            // L'uso di un FixedDocument, mi permetterà di interagire con misure, dimensioni e margini
                            FixedDocument document = new FixedDocument();
                            document.DocumentPaginator.PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);


                            // Creo una pagina della grandezza massima
                            FixedPage page1 = new FixedPage();
                            page1.Width               = document.DocumentPaginator.PageSize.Width;
                            page1.Height              = document.DocumentPaginator.PageSize.Height;
                            page1.VerticalAlignment   = VerticalAlignment.Center;
                            page1.HorizontalAlignment = HorizontalAlignment.Center;


                            // Per fare in modo che l'immagine venga centrata bene automaticamente, e non venga tagliata solo da una parte ma nel centro,
                            // non devo mettere le dimensioni al componente Image, ma devo creare
                            // una Grid più esterna con le dimensioni precise.
                            Grid grid = new Grid();
                            grid.Height = page1.Height;
                            grid.Width  = page1.Width;


                            // Creo una immagine che contiene la bitmap da stampare
                            Image image = new Image();
                            //						image.BeginInit();
                            image.VerticalAlignment   = VerticalAlignment.Center;
                            image.HorizontalAlignment = HorizontalAlignment.Center;

                            //						BitmapSource clone = bmp.Clone();
                            //						clone.Freeze();
                            image.Source = bmp;

                            if (_lavoroDiStampa.param.autoZoomNoBordiBianchi)
                            {
                                image.Stretch = Stretch.UniformToFill;
                            }
                            else
                            {
                                image.Stretch = Stretch.Uniform;
                            }
                            image.StretchDirection = StretchDirection.Both;

                            //						image.EndInit();

                            grid.Children.Add(image);
                            page1.Children.Add(grid);

                            //
                            eventualiStampigli(page1, _lavoroDiStampa);


                            // add the page to the document
                            PageContent page1Content = new PageContent();
                            page1Content.Child = page1;
                            document.Pages.Add(page1Content);

                            //
                            // ----- STAMPA per davvero
                            //
                            for (int ciclo = 0; ciclo < cicliStampa; ciclo++)
                            {
                                dialog.PrintDocument(document.DocumentPaginator, titolo.ToString());

                                _esito = EsitoStampa.Ok;
                            }
                            _giornale.Debug("Stampa completata");

                            // Per cercare di liberare memoria più possibile svuoto le pagine  forzatamente a mano.
                            // Pare che il GC non riesce a pulire.
                            foreach (var fixedPage in document.Pages.Select(pageContent => pageContent.Child))
                            {
                                fixedPage.Children.Clear();
                            }
                        }         // using printqueue
                    }             // using printserver
                }                 // using iimagine
            } catch (Exception ee) {
                _esito = EsitoStampa.Errore;
                _giornale.Error("Stampa fallita", ee);
            } finally {
                // Rilascio le immagini idratate altrimenti in loop vado in outOfMemory
                AiutanteFoto.disposeImmagini(_lavoroDiStampa.fotografia, IdrataTarget.Risultante);
                AiutanteFoto.disposeImmagini(_lavoroDiStampa.fotografia, IdrataTarget.Originale);

                CoreUtil.abraCadabra();                   //   :-)
            }


            _giornale.Info("Completato lavoro di stampa. Esito = " + _esito + " lavoro = " + lavoroDiStampa.ToString());
            return(_esito);
        }
Esempio n. 6
0
        private void aggiungiImmagineAlCanvas(Canvas canvas, Fotografia foto, int riga, int col)
        {
            try {
                // Ricavo l'immagine da stampare
                IImmagine immagine;

                bool usoGrande = false;
                if (usoGrande)
                {
                    AiutanteFoto.idrataImmagineDaStampare(foto);
                    immagine = AiutanteFoto.idrataImmagineGrande(foto);

                    immaginiPaginaPrecedente.Add(immagine);
                }
                else
                {
                    AiutanteFoto.idrataImmaginiFoto(foto, IdrataTarget.Provino);
                    immagine = foto.imgProvino;
                }


                Image img = new Image();
                img.Stretch          = Stretch.UniformToFill;
                img.StretchDirection = StretchDirection.Both;

                {
                    // calcolo posizione left
                    int    tc      = lavoroDiStampaTessera.paramStampaTessera.numColonne;
                    double tuc     = sizeLatoW * tc;
                    double spaziow = (larghezzaEffettiva - tuc) / (tc + 1);
                    double left    = (spaziow * col) + (sizeLatoW * (col - 1));

                    img.SetValue(Canvas.LeftProperty, left);
                }

                {
                    // calcolo posizione top
                    int    tr      = lavoroDiStampaTessera.paramStampaTessera.numRighe;
                    double tur     = sizeLatoH * tr;
                    double spazioh = (altezzaEffettiva - tur) / (tr + 1);
                    double top     = (spazioh * riga) + (sizeLatoH * (riga - 1));

                    img.SetValue(Canvas.TopProperty, top);
                }

                // Queste due dimensioni invece sono fisse
                img.Width  = sizeLatoW;
                img.Height = sizeLatoH;

                img.HorizontalAlignment = HorizontalAlignment.Center;
                img.VerticalAlignment   = VerticalAlignment.Center;
                if (immagine != null)
                {
                    img.RenderSize = new Size(img.Width, img.Height);                        // TODO tento di tenere bassa la memoria
                    img.BeginInit();
                    BitmapSource bs = ((ImmagineWic)immagine).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);
            }
        }
Esempio n. 7
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);
        }