예제 #1
0
        /// <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);
        }
예제 #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));
        }
예제 #3
0
        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
            }
        }