public IImmagine applicaCorrezione(IImmagine immaginePartenza, Correzione correzione)
        {
            Correttore correttore = gestoreImmaginiSrv.getCorrettore(correzione);

            _giornale.Debug("applico correzione: " + correttore);
            return(correttore.applica(immaginePartenza, correzione));
        }
Exemple #2
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            // Non spostare da qui questo vettore. Deve essere istanziato ogni volta, altrimenti romper il cavolo con i thread diversi
            ShaderEffect [] localEffetcs = new ShaderEffect[] { new GrayscaleEffect() };

            ImmagineWic iw = (ImmagineWic)immagineSorgente;

            BitmapSource modificata = EffectsUtil.RenderImageWithEffectsToBitmap(iw.bitmapSource, localEffetcs);

            return(new ImmagineWic(modificata));
        }
Exemple #3
0
        public override Correzione somma(Correzione altra)
        {
            Dominante dAltra = altra as Dominante;

            Dominante ris = new Dominante {
                rosso = this.rosso + dAltra.rosso,
                verde = this.verde + dAltra.verde,
                blu   = this.blu + dAltra.blu
            };

            return(ris);
        }
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            // Purtroppo devo creare un array con un solo elemento. TODO migliorare
            ShaderEffect lce = (ShaderEffect)ConvertTo(correzione, typeof(ShaderEffect));

            ShaderEffect [] _effetti = new ShaderEffect [] { lce };

            ImmagineWic iw = (ImmagineWic)immagineSorgente;

            BitmapSource modificata = EffectsUtil.RenderImageWithEffectsToBitmap(iw.bitmapSource, _effetti);

            return(new ImmagineWic(modificata));
        }
Exemple #5
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            BitmapSource bitmapSource = ((ImmagineWic)immagineSorgente).bitmapSource;

            Crop      cropCorrezione = (Crop)correzione;
            Int32Rect rect           = calcolaRettangolo(cropCorrezione, bitmapSource.PixelWidth, bitmapSource.PixelHeight);

            var croppedImage = new CroppedBitmap(bitmapSource, rect);

            BitmapSource newBitmap = (BitmapSource)croppedImage;

            return(new ImmagineWic(newBitmap));
        }
Exemple #6
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            ImmagineWic  imgSorgente  = (ImmagineWic)immagineSorgente;
            BitmapSource bitmapSource = imgSorgente.bitmapSource;

            ScaleTransform scaleTransform = new ScaleTransform();

            scaleTransform.ScaleX = -1;

            // Create the TransformedBitmap to use as the Image source.
            TransformedBitmap tb = new TransformedBitmap(bitmapSource, scaleTransform);

            ImmagineWic modificata = new ImmagineWic(tb);

            return(modificata);
        }
Exemple #7
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            // Purtroppo devo creare un array con un solo elemento. TODO migliorare
            DominantiEffect de = new DominantiEffect();

            de.Red   = ((Dominante)correzione).rosso;
            de.Green = ((Dominante)correzione).verde;
            de.Blue  = ((Dominante)correzione).blu;
            ShaderEffect [] _effetti = new ShaderEffect [] { de };

            ImmagineWic iw = (ImmagineWic)immagineSorgente;

            BitmapSource modificata = EffectsUtil.RenderImageWithEffectsToBitmap(iw.bitmapSource, _effetti);

            return(new ImmagineWic(modificata));
        }
        public Correzione converteInCorrezione(TipoCorrezione tipoDest, Object trasformazione)
        {
            Correzione correzione = null;

            if (trasformazione != null)
            {
                Correttore correttore = gestoreImmaginiSrv.getCorrettore(tipoDest);
                if (correttore != null)
                {
                    if (correttore.CanConvertFrom(trasformazione.GetType()))
                    {
                        correzione = (Correzione)correttore.ConvertFrom(trasformazione);
                    }
                }
            }

            return(correzione);
        }
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            BitmapSource bmpsource       = ((ImmagineWic)immagineSorgente).bitmapSource;
            Ruota        ruotaCorrezione = (Ruota)correzione;

            BitmapSource newBmp;

            if (ruotaCorrezione.isAngoloRetto)
            {
                newBmp = rotazioneSemplice(bmpsource, ruotaCorrezione.gradi);
            }
            else
            {
                newBmp = rotazioneSulPosto(bmpsource, ruotaCorrezione.gradi);
            }
//				newBmp = rotazioneComplessa( bmpsource, ruotaCorrezione.gradi );

            return(new ImmagineWic(newBmp));
        }
Exemple #10
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            Image imageSorgente = ((ImmagineNet)immagineSorgente).image;

            ImageAttributes ia = new ImageAttributes();

            ia.SetColorMatrix(_colorMatrix);

            Image imageDest = new Bitmap(imageSorgente.Width, imageSorgente.Height);

            using (Graphics g = Graphics.FromImage(imageDest)) {
                // Definisco l'area di destinazione (è uguale a quella sorgente)
                Rectangle rr = new Rectangle(0, 0, imageSorgente.Width, imageSorgente.Height);
                g.DrawImage(imageSorgente, rr,
                            0, 0, imageSorgente.Width, imageSorgente.Height,
                            GraphicsUnit.Pixel, ia);
            }

            return(new ImmagineNet(imageDest));
        }
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            throw new NotImplementedException("occorre un container per traslare");

            // TODO da capire.
            // Concettualmente non ha senso traslare una immagine su se stessa.
            // Occorre avere un riferimento, un contenitore esterno su cui agire.
            // Una immagine con appiccicata una traslazione ha senso, ma l'immagine risultante da sola che senso ha ?
#if CONCETTUALMENTE_NON_VALIDO
            ImmagineWic  imgSorgente  = (ImmagineWic)immagineSorgente;
            BitmapSource bitmapSource = imgSorgente.bitmapSource;

            TranslateTransform tt = (TranslateTransform)this.ConvertTo(correzione, typeof(TranslateTransform));

            // Create the TransformedBitmap to use as the Image source.
            TransformedBitmap tb = new TransformedBitmap(bitmapSource, tt);

            ImmagineWic modificata = new ImmagineWic(tb);
            return(modificata);
#endif
        }
        /// <summary>
        /// Aggiungo una correzione ad una lista di correzione.
        /// Se la correzione esiste già, gestisco eventuale somma, oppure rimozione in caso che sia inutile (ininfluente)
        /// </summary>
        /// <param name="correzioni"></param>
        /// <param name="correzioneNuova"></param>
        public void addCorrezione(ref CorrezioniList correzioni, Correzione correzioneNuova)
        {
            // Alcune correzioni, non devono andare sempre in aggiunta, ma possono sommarsi l'un l'altra.
            // Per esempio la rotazione. Se ruoto 90° poi altri 90, l'effetto finale è quello di avere una sola da 180°
            Correzione daSost  = null;
            Correzione vecchia = null;

            foreach (Correzione c in correzioni)
            {
                if (c.isSommabile(correzioneNuova))
                {
                    vecchia = c;
                    daSost  = c.somma(correzioneNuova);
                    break;
                }
            }

            if (daSost != null)
            {
                // Sostituisco la correzione con quella ricalcolata
                if (daSost.isInutile)
                {
                    correzioni.Remove(vecchia);
                }
                else
                {
                    correzioni.sostituire(vecchia, daSost);
                }
            }
            else
            {
                // Aggiungo in fondo (se la correzione è inutile, allora non aggiungo nulla)
                if (!correzioneNuova.isInutile)
                {
                    correzioni.Add(correzioneNuova);
                }
            }
        }
        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);
        }
Exemple #14
0
 public override bool isSommabile(Correzione altra)
 {
     return(altra is Dominante);
 }
Exemple #15
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));
        }
 public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
 {
     throw new NotImplementedException();
 }
Exemple #17
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));
        }
Exemple #18
0
 public Correttore getCorrettore(Correzione correzione)
 {
     // Se non ce l'ho in cache, allora lo creo.
     return(_correttoreFactory.creaCorrettore(correzione.GetType()));
 }
 public void addCorrezione(Fotografia fotografia, Correzione correzione)
 {
     addCorrezione(fotografia, correzione, false);
 }
        /// <summary>
        /// Aggiungo una correzione a quelle già eventualmente presenti sulla foto.
        /// Se la correzione esiste già, gestisco eventuale somma, oppure rimozione in caso che sia inutile (ininfluente)
        /// </summary>
        /// <param name="fotografia">la foto</param>
        /// <param name="correzione">la correzione da aggiungere</param>
        public void addCorrezione(Fotografia fotografia, Correzione correzioneNuova, bool salvare)
        {
            CorrezioniList correzioni;

            // Deserializzo la stringa con le eventuali correzioni attuali
            if (fotografia.correzioniXml == null)
            {
                correzioni = new CorrezioniList();
            }
            else
            {
                correzioni = SerializzaUtil.stringToObject <CorrezioniList>(fotografia.correzioniXml);
            }


            // Alcune correzioni, non devono andare sempre in aggiunta, ma possono sommarsi l'un l'altra.
            // Per esempio la rotazione. Se ruoto 90° poi altri 90, l'effetto finale è quello di avere una sola da 180°
            Correzione daSost  = null;
            Correzione vecchia = null;

            foreach (Correzione c in correzioni)
            {
                if (c.isSommabile(correzioneNuova))
                {
                    vecchia = c;
                    daSost  = c.somma(correzioneNuova);
                    break;
                }
            }

            if (daSost != null)
            {
                // Sostituisco la correzione con quella ricalcolata
                if (daSost.isInutile)
                {
                    correzioni.Remove(vecchia);
                }
                else
                {
                    correzioni.sostituire(vecchia, daSost);
                }
            }
            else
            {
                // Aggiungo in fondo (se la correzione è inutile, allora non aggiungo nulla)
                if (!correzioneNuova.isInutile)
                {
                    correzioni.Add(correzioneNuova);
                }
            }

            // Ora serializzo di nuovo in stringa tutte le correzioni
            fotografia.correzioniXml = SerializzaUtil.objectToString(correzioni);

            if (salvare)
            {
                fotografieRepositorySrv.saveChanges();                  // Persisto nel db le modifiche

                AiutanteFoto.creaProvinoFoto(fotografia);

                // Devo informare tutti che questa foto è cambiata
                FotoModificateMsg msg = new FotoModificateMsg(this, fotografia);
                pubblicaMessaggio(msg);
            }
        }
Exemple #21
0
        public override IImmagine applica(IImmagine immagineSorgente, Correzione correzione)
        {
            Scritta scritta = (Scritta)correzione;

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

            var ww = bmpSorgente.PixelWidth;
            var hh = bmpSorgente.PixelHeight;

            // -- creo un contenitore che mi permette di avere il controllo completo del posizionamento
            Panel contenitore = new Grid();

            contenitore.Width  = ww;
            contenitore.Height = hh;
//			contenitore.VerticalAlignment = VerticalAlignment.Center;
//			contenitore.HorizontalAlignment = HorizontalAlignment.Center;

            Image image = new Image();

            image.BeginInit();
            image.Source = bmpSorgente;
            image.EndInit();

            contenitore.Children.Add(image);


            /*
             *                      Rect rectContenitore = new Rect( 0, 0, scritta.rifContenitoreW, scritta.rifContenitoreH );
             *                      Rect rectScrittaOrig = new Rect( scritta.left, scritta.top, scritta.width, scritta.height );
             *
             *                      Size nuovaSizeFoto = new Size( ww, hh );
             *
             *                      Rect newRect = Geometrie.proporziona( rectScrittaOrig, rectContenitore, nuovaSizeFoto );
             */
            TextPath textPath = new TextPath();

            textPath.Text       = scritta.testo;
            textPath.FontFamily = new FontFamily(scritta.fontFamily);
            textPath.FontSize   = scritta.fontSize;
            if (scritta.fillImage == null)
            {
                textPath.Fill = (SolidColorBrush) new BrushConverter().ConvertFromString(scritta.fillColor);
            }
            textPath.Stroke          = (SolidColorBrush) new BrushConverter().ConvertFromString(scritta.strokeColor);
            textPath.StrokeThickness = scritta.strokeThickness;

            Viewbox viewBox = new Viewbox();

            viewBox.Child = textPath;
            Canvas.SetZIndex(viewBox, 10);


            contenitore.Children.Add(viewBox);


            var size = new Size(ww, hh);

            contenitore.Measure(size);
            contenitore.Arrange(new Rect(size));


            TransformGroup gruppo = new TransformGroup();


            // ROTAZIONE
            if (scritta.rotazione != null)
            {
                RotateTransform rot = new RotateTransform(scritta.rotazione.gradi);

                // La rotazione avviene sempre nel centro dell'elemento
                var l = Double.IsNaN(Canvas.GetLeft(viewBox)) ? 0 : Canvas.GetLeft(viewBox);
                var t = Double.IsNaN(Canvas.GetTop(viewBox)) ? 0 : Canvas.GetTop(viewBox);
                rot.CenterX = l + (viewBox.ActualWidth / 2);
                rot.CenterY = t + (viewBox.ActualHeight / 2);
                //				TransformGroup tg = new TransformGroup();
                //				tg.Children.Add( rot );
                gruppo.Children.Add(rot);
            }

            // TRASLAZIONE (move)
            if (scritta.traslazione != null)
            {
                // devo riproporzionare le coordinate di origine a quelle attuali.

                // spostaX : oldW = newSpostaH : newW
                //
                var newOffsetX = contenitore.ActualWidth * scritta.traslazione.offsetX / scritta.traslazione.rifW;
                var newOffsetY = contenitore.ActualHeight * scritta.traslazione.offsetY / scritta.traslazione.rifH;

                TranslateTransform tre = new TranslateTransform(newOffsetX, newOffsetY);
                gruppo.Children.Add(tre);
            }


            if (scritta.zoom != null)
            {
                ScaleTransform stx = new ScaleTransform(scritta.zoom.fattore, scritta.zoom.fattore);
                gruppo.Children.Add(stx);

                stx.CenterX = (viewBox.RenderSize.Width / 2);
                stx.CenterY = (viewBox.RenderSize.Height / 2);
            }

            if (gruppo.Children.Count > 0)
            {
                viewBox.RenderTransform = gruppo;
            }



            contenitore.InvalidateMeasure();
            contenitore.InvalidateArrange();

            contenitore.Measure(size);
            contenitore.Arrange(new Rect(size));



            /*
             *                      Rect rectSotto = new Rect( 0, 0, bmpSorgente.PixelWidth, bmpSorgente.PixelHeight );
             *                      ImageDrawing drawingSotto = new ImageDrawing( bmpSorgente, rectSotto );
             */
            RenderTargetBitmap bmp = new RenderTargetBitmap(ww, hh, 96, 96, PixelFormats.Pbgra32);



            bmp.Render(contenitore);

            BmpBitmapEncoder enc = new BmpBitmapEncoder();

            enc.Frames.Add(BitmapFrame.Create(bmp));
            byte[] imagebit;             //You can save your copy data in byte[].
            using (MemoryStream stream = new MemoryStream()) {
                enc.Save(stream);
                imagebit = stream.ToArray();
                stream.Close();
            }


            var bitmap = new BitmapImage();

            using (var stream = new MemoryStream(imagebit)) {
                bitmap.BeginInit();
                bitmap.StreamSource = stream;
                bitmap.CacheOption  = BitmapCacheOption.OnLoad;
                bitmap.EndInit();
                bitmap.Freeze();
            }

            return(new ImmagineWic(bitmap));
        }