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); }
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)); }