Пример #1
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);
        }
Пример #2
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            Logo logoCorrezione = (Logo)correzione;

            // Questo è il nome del file completo su disco della immagine del logo
            string nomeCompletoLogo = PathUtil.nomeCompletoLogo(logoCorrezione);

            if (!File.Exists(nomeCompletoLogo))
            {
                throw new FileNotFoundException(nomeCompletoLogo);
            }

            // Costruisco l'immagine di overlay
            ImmagineWic imgLogo = new ImmagineWic(nomeCompletoLogo);

            // Ricavo la bitmap sorgente
            BitmapSource bmpSorgente = ((ImmagineWic)immagineSorgente).bitmapSource;

            // -- inizio ad applicare le trasformazioni al logo
            IImmagine immagineLogoModificato = imgLogo;

            //
            // :: rotazione
            //

            if (logoCorrezione.rotazione != null)
            {
                RuotaCorrettore ruotaCorrettore = new RuotaCorrettore();
                immagineLogoModificato = ruotaCorrettore.applica(immagineLogoModificato, logoCorrezione.rotazione);
            }

            //
            // :: zoom
            //

            if (logoCorrezione.zoom != null)
            {
                ZoomCorrettore zoomCorrettore = new ZoomCorrettore();
                immagineLogoModificato = zoomCorrettore.applica(immagineLogoModificato, logoCorrezione.zoom);
            }

            BitmapSource bitmapSourceLogoModificato = ((ImmagineWic)immagineLogoModificato).bitmapSource;

            //
            // :: traslazione
            //

            // Queste sono le coordinate su cui disegnare il logo
            Rect posiz = calcolaCoordinateLogo(bmpSorgente.PixelWidth, bmpSorgente.PixelHeight, immagineLogoModificato.ww, immagineLogoModificato.hh, logoCorrezione);

            // Creo due immagini disegnabili con i rettangoli delle immagini interessate
            // 1. Tutta la foto di sfondo
            Rect         rectSotto    = new Rect(0, 0, bmpSorgente.PixelWidth, bmpSorgente.PixelHeight);
            ImageDrawing drawingSotto = new ImageDrawing(bmpSorgente, rectSotto);

            // 2. Il riquando ricalcolato del logo
            Rect         rectSopra    = new Rect(posiz.Left, posiz.Top, posiz.Width, posiz.Height);
            ImageDrawing drawingSopra = new ImageDrawing(bitmapSourceLogoModificato, rectSopra);

            // Adesso ho entrambe le immagini. Le sovrappongo usando un gruppo.
            DrawingGroup myDrawingGroup = new DrawingGroup();

            myDrawingGroup.Children.Add(drawingSotto);
            myDrawingGroup.Children.Add(drawingSopra);
            // Disegno il gruppo in una nuova immagine.
            Image myImage = new Image();

            myImage.Source = new DrawingImage(myDrawingGroup);

            int w = (int)rectSotto.Width;
            int h = (int)rectSotto.Height;
            // Renderizzo l'immagine finita, in una bitmap in modo da poterla ritornare.
            RenderTargetBitmap rtb = new RenderTargetBitmap(w, h, 96d, 96d, PixelFormats.Default);

            DrawingVisual dv = new DrawingVisual();

            using (DrawingContext ctx = dv.RenderOpen()) {
                ctx.DrawDrawing(myDrawingGroup);
            }
            rtb.Render(dv);

            return(new ImmagineWic(rtb));
        }