public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            _giornale.Debug("Richiesta correzione: " + correzione.GetType().Name);

            long   calcW, calcH;
            Resize resizeCorrezione = (Resize)correzione;

            ResizeCorrettore.calcolaEsattaWeH(immagineSorgente, resizeCorrezione.latoMax, out calcW, out calcH);

            BitmapSource bitmapSource = ((ImmagineWic)immagineSorgente).bitmapSource;


            /* I dpi sono una indicazione per la stampa.
             * Non impattano sui dati dell'immagine.
             * Non impattano sulla dimensione dell'immagine.
             * Non impattano sulla qualità dell'immagine.
             * In pratica è solo un "consiglio" per la stampa.
             *
             * Siccome credo che le stampanti termiche/sublimazione se ne fregano di questo parametro (per ovvi motivi)
             * allora me ne sbatto.
             * Occorrebbe fare una prova con una laser o con una InkJet per vedere se il risultato stampato cambia.
             *
             * int quantiDpi;
             * quantiDpi = (int) Math.Max( bitmapSource.DpiX, bitmapSource.DpiY );
             * quantiDpi = (int) Math.Max( quantiDpi, DPI_PROVINO );
             */

            BitmapSource bitmapFrame = Resize(bitmapSource, calcW, calcH, DPI_PROVINO);

            // _giornale.Debug( "effettuato resize" );
            if (bitmapFrame.CanFreeze)
            {
                bitmapFrame.Freeze();
            }
            ImmagineWic immagine = new ImmagineWic(bitmapFrame);

            return(immagine);
        }
Exemple #2
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            // Ricavo la bitmap sorgente
            BitmapSource bmpSorgente = ((ImmagineWic)immagineSorgente).bitmapSource;

            AreaRispetto areaRispetto = (AreaRispetto)correzione;


            CalcolatoreAreeRispetto.Geo imageGeo = new CalcolatoreAreeRispetto.Geo();

            // Calcolo la fascia A
            imageGeo.w = immagineSorgente.ww;
            imageGeo.h = immagineSorgente.hh;
            Rect rettangoloA = CalcolatoreAreeRispetto.calcolaDimensioni(CalcolatoreAreeRispetto.Fascia.FasciaA, areaRispetto.ratio, imageGeo);

            CalcolatoreAreeRispetto.Bordi bordiA = CalcolatoreAreeRispetto.calcolcaLatiBordo(CalcolatoreAreeRispetto.Fascia.FasciaA, areaRispetto.ratio, imageGeo, imageGeo);

            // Calcolo la fascia B
            imageGeo.w = immagineSorgente.ww;
            imageGeo.h = immagineSorgente.hh;
            Rect rettangoloB = CalcolatoreAreeRispetto.calcolaDimensioni(CalcolatoreAreeRispetto.Fascia.FasciaB, areaRispetto.ratio, imageGeo);

            CalcolatoreAreeRispetto.Bordi bordiB = CalcolatoreAreeRispetto.calcolcaLatiBordo(CalcolatoreAreeRispetto.Fascia.FasciaB, areaRispetto.ratio, imageGeo, imageGeo);


            BitmapSource bmpFinale = null;

            if (areaRispetto.costringi)
            {
                int w = 0, h = 0;

                // Devo fare un resize che preservi il canale alpha (ovviamente l'immagine potrà risultare distorta, perché non devo preservare le proporzioni
                if (bordiA.right || bordiA.left || bordiB.right || bordiB.left)
                {
                    // Taglio verticale: la foto è orizzontale
                    w = immagineSorgente.ww - (int)rettangoloA.Width - (int)rettangoloB.Width;
                    h = immagineSorgente.hh;
                }
                if (bordiA.top || bordiA.bottom || bordiB.top || bordiB.bottom)
                {
                    // Tagli orizzontali: la foto è verticale
                    h = immagineSorgente.hh - (int)rettangoloA.Height - (int)rettangoloB.Height;
                    w = immagineSorgente.ww;
                }

                bmpFinale = ResizeCorrettore.Resize(bmpSorgente, w, h, (int)bmpSorgente.DpiX);
            }
            else
            {
                // Create a DrawingVisual/Context to render with
                DrawingVisual drawingVisual = new DrawingVisual();
                Rect          rect          = new Rect(0, 0, immagineSorgente.ww, immagineSorgente.hh);

                RenderTargetBitmap renderTargetBitmap = null;

                Pen pennaRossa = new Pen(Brushes.Red, 2);
                pennaRossa.DashStyle = DashStyles.Dash;                 // tratteggio

                using (DrawingContext drawingContext = drawingVisual.RenderOpen()) {
                    drawingContext.DrawImage(bmpSorgente, rect);

                    // Prima linea di rispetto : calcolo i due punti
                    Point p1, p2, p3, p4;
                    calcolaPunti(bordiA, rettangoloA, out p1, out p2);
                    calcolaPunti(bordiB, rettangoloB, out p3, out p4);

                    // Disegno le due linee di rispetto
                    drawingContext.DrawLine(pennaRossa, p1, p2);
                    drawingContext.DrawLine(pennaRossa, p3, p4);
                }

                renderTargetBitmap = new RenderTargetBitmap((int)rect.Width, (int)rect.Height, 96, 96, PixelFormats.Default);
                renderTargetBitmap.Render(drawingVisual);
                bmpFinale = renderTargetBitmap;
            }

            if (bmpFinale.CanFreeze)
            {
                bmpFinale.Freeze();
            }

            return(new ImmagineWic(bmpFinale));
        }
Exemple #3
0
        public Correttore creaCorrettore(Type tipo)
        {
            Correttore correttore = null;

            // Prima controllo in cache
            if (_cache.ContainsKey(tipo))
            {
                correttore = _cache[tipo];
            }
            else
            {
                // In base al tipo di correzione, istanzio il giusto correttore
                // In base al tipo di correzione, istanzio il giusto correttore
                if (tipo == typeof(BiancoNero))
                {
                    correttore = new BiancoNeroCorrettore();
                }
                else if (tipo == typeof(Resize))
                {
                    correttore = new ResizeCorrettore();
                }
                else if (tipo == typeof(Sepia))
                {
                    correttore = new SepiaCorrettore();
                }
                else if (tipo == typeof(OldMovie))
                {
                    correttore = new OldMovieCorrettore();
                }
                else if (tipo == typeof(Ruota))
                {
                    correttore = new RuotaCorrettore();
                }
                else if (tipo == typeof(Specchio))
                {
                    correttore = new SpecchioCorrettore();
                }
                else if (tipo == typeof(Luce))
                {
                    correttore = new LuminositaContrastoCorrettore();
                }
                else if (tipo == typeof(Crop))
                {
                    correttore = new CropCorrettore();
                }
                else if (tipo == typeof(Gimp))
                {
                    correttore = new GimpCorrettore();
                }
                else if (tipo == typeof(Dominante))
                {
                    correttore = new DominantiCorrettore();
                }
                else if (tipo == typeof(Zoom))
                {
                    correttore = new ZoomCorrettore();
                }
                else if (tipo == typeof(Trasla))
                {
                    correttore = new TraslaCorrettore();
                }
                else if (tipo == typeof(Mascheratura))
                {
                    correttore = new MascheraturaCorrettore();
                }
                else if (tipo == typeof(MascheraturaOrientabile))
                {
                    correttore = new MascheraturaCorrettore();
                }
                else if (tipo == typeof(Logo))
                {
                    correttore = new LogoCorrettore();
                }
                else if (tipo == typeof(AreaRispetto))
                {
                    correttore = new AreaRispettoCorrettore();
                }
                else if (tipo == typeof(Scritta))
                {
                    correttore = new ScrittaCorrettore();
                }

                if (correttore != null)
                {
                    _cache.Add(tipo, correttore);                        // Metto in cache
                }
                else
                {
                    throw new NotSupportedException("tipo correzione = " + tipo);
                }
            }

            return(correttore);
        }