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