/// <summary> /// Abbiamo due rettangoli che servono per "coprire" la zona non stampabile della foto. Chiamiamoli a) e b) /// Questi rettangoli hanno 4 valori di posizionamento (L, T, W, H) che sono dipendenti dalla grandezza /// della foto, e dal suo orientamento. /// /// </summary> /// <param name="values"> /// 0) il ratio dell'area stampabile di riferimento per calcolare il taglio. /// 1) Image.Width = è la larghezza del componente Image (che contiene la foto) /// 2) Image.Height = è la altezza del componente Image (che contiene la foto) /// 3) Image.ActualWidth = è la larghezza effettiva della foto (dovuta allo stretch=Uniform) /// 4) Image.ActualHeight = è la altezza effettiva della foto (dovuta allo stretch=Uniform) /// </param> /// <param name="targetType"></param> /// <param name="parameter"> /// Una stringa separata da punti e virgola: /// esempio: a,W /// significa che sto trattando il rettangolo a) e che voglio avere in output la Width del rettangolo a) /// </param> /// <param name="culture"></param> /// <returns></returns> public object Convert(object [] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string[] pezzi = ((string)parameter).Split(';'); CalcolatoreAreeRispetto.Fascia qualeFascia = (CalcolatoreAreeRispetto.Fascia)(pezzi[0][0]); // Può valere: a, b CalcolatoreAreeRispetto.Dimensione qualeDimens = (CalcolatoreAreeRispetto.Dimensione)(pezzi[1][0]); // Può valere: W, H, L, T string flagBordi = null; if (pezzi.Length > 2) { flagBordi = pezzi[2]; // Può valere "T" oppure niente } // Ricavo dal vettore dei parametri delle variabili con un nome più chiaro. float ratioCarta = (float)values[0]; CalcolatoreAreeRispetto.Geo imageGeo = new CalcolatoreAreeRispetto.Geo(); imageGeo.w = (double)values[1]; imageGeo.h = (double)values[2]; CalcolatoreAreeRispetto.Geo imageActualGeo = new CalcolatoreAreeRispetto.Geo(); imageActualGeo.w = (double)values[3]; imageActualGeo.h = (double)values[4]; object ret = null; if (flagBordi == "T") { CalcolatoreAreeRispetto.Bordi bordo = CalcolatoreAreeRispetto.calcolcaLatiBordo(qualeFascia, ratioCarta, imageGeo, imageActualGeo); Thickness t = new Thickness(); if (bordo.left) { t.Left = spessoreLinea; } if (bordo.top) { t.Top = spessoreLinea; } if (bordo.bottom) { t.Bottom = spessoreLinea; } if (bordo.right) { t.Right = spessoreLinea; } ret = t; } else { ret = CalcolatoreAreeRispetto.calcolaDimensione(qualeFascia, qualeDimens, ratioCarta, imageGeo, imageActualGeo); } return(ret); }
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)); }
void dimensionaRettangoloPerAreaDiRispetto(Rectangle[] rettangoli, Grid fotoGrid) { try { Rectangle rectA = rettangoli[0]; Rectangle rectB = rettangoli[1]; // Ora ricalcolo la dimensione dell'area di rispetto // float ratio = fotoGalleryViewModel.ratioAreaStampabile; if (fotoGalleryViewModel.ratioAreaStampabile == 0f) { return; } CalcolatoreAreeRispetto.Geo imageGeo = new CalcolatoreAreeRispetto.Geo(); Image fotoImage = (Image)fotoGrid.FindName(nomeComponenteImmagine); imageGeo.w = fotoImage.ActualWidth; imageGeo.h = fotoImage.ActualHeight; // Calcolo la fascia A Rect rettangoloA = CalcolatoreAreeRispetto.calcolaDimensioni(CalcolatoreAreeRispetto.Fascia.FasciaA, ratioRispetto, imageGeo); CalcolatoreAreeRispetto.Bordi bordiA = CalcolatoreAreeRispetto.calcolcaLatiBordo(CalcolatoreAreeRispetto.Fascia.FasciaA, ratioRispetto, imageGeo, imageGeo); // Calcolo la fascia B Rect rettangoloB = CalcolatoreAreeRispetto.calcolaDimensioni(CalcolatoreAreeRispetto.Fascia.FasciaB, ratioRispetto, imageGeo); CalcolatoreAreeRispetto.Bordi bordiB = CalcolatoreAreeRispetto.calcolcaLatiBordo(CalcolatoreAreeRispetto.Fascia.FasciaB, ratioRispetto, imageGeo, imageGeo); // Calcolo left e top in base alla posizione della immagine rispetto alla grid che la contiene var qq = fotoImage.TransformToAncestor(fotoGrid); Point relativePoint = qq.Transform(new Point(0, 0)); double currentLeft = relativePoint.X; double currentTop = relativePoint.Y; // Setto fascia A rectA.Width = rettangoloA.Width; rectA.Height = rettangoloA.Height; var left = currentLeft + rettangoloA.Left; var top = currentTop + rettangoloA.Top; var right = 0; var bottom = 0; Thickness ticA = new Thickness(left, top, right, bottom); rectA.Margin = ticA; // --- // Setto fascia B rectB.Width = rettangoloB.Width; rectB.Height = rettangoloB.Height; left = currentLeft + rettangoloB.Left; top = currentTop + rettangoloB.Top; right = 0; bottom = 0; Thickness ticB = new Thickness(left, top, right, bottom); rectB.Margin = ticB; } catch (Exception) { // pazienza : dovrei loggare l'errore } }