Resumé

Puzzle Prospettico con GDIplus e .NET

Cristian Merighi () 0,00

Come utilizzare i metodi (già postati) su distorsione e sovrapposizione delle immagini per ottenere una composizione simil-prospettica. Codice C#.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.

Questo articolo presenta uno scenario comune per l'utilizzo di due delle features del mio componente .Net 2.0 GDI+ Pacem.Drawing.Image.
Si tratta della distorisione delle immagini e della sovrapposizione multipla delle stesse (fate pure riferimento a ciò che è riportato nei due articoli sotto):

Il nostro è creare una sorta di "puzzle prospettico" distorcendo e sovrapponendo 5 diverse immagini, alla maniera che segue schematizzata sotto:

scheme

Ora le righe di codice (C#). Farò riferimento alla mia classe Pacem.Drawing.Image e ad i suoi membri. Ricordo che i vari Distort ed OverlayImage possono essere sostituiti dagli stessi riportati nei due articoli di cui sopra.

protected void Page_Load(object sender, EventArgs e)
{
    // the rectangle A'B'C'D' in figure has the following dimensions
    System.Drawing.Rectangle innerRect = new Rectangle(new Point(50, 100), new Size(150, 50));

    Pacem.Drawing.Image xc = new Pacem.Drawing.Image(Server.MapPath("~/1.jpg"));
    // AB segment = 480px
    // BC segment = 360px
    xc.ResizeImage(480, 360, true);

    Point A = new Point(0, 0);
    Point B = new Point(480, 0);
    Point C = new Point(480, 360);
    Point D = new Point(0, 360);
    Point A1 = new Point(innerRect.X, innerRect.Y);
    Point B1 = new Point(innerRect.X + innerRect.Width, innerRect.Y);
    Point C1 = new Point(innerRect.X + innerRect.Width, innerRect.Y + innerRect.Height);
    Point D1 = new Point(innerRect.X, innerRect.Y + innerRect.Height);

    // image 1
    using (MemoryStream ms = new MemoryStream())
    {
        using (Pacem.Drawing.Image xc1 = new Pacem.Drawing.Image(Server.MapPath("~/1.jpg")))
        {
            xc1.Distort(A, B, A1, B1);
            xc1.Flush(ms, "image/png");
            using (System.Drawing.Image bmp = Bitmap.FromStream(ms))
            {
                xc.OverlayImage(bmp, A);
            }
        }
    }

    // image 2
    // distorted using A2BB' coordinate system
    using (MemoryStream ms = new MemoryStream())
    {
        using (Pacem.Drawing.Image xc2 = new Pacem.Drawing.Image(Server.MapPath("~/2.jpg")))
        {
            xc2.Distort(new Point(0, B1.Y), new Point(B.X-B1.X, 0) , new Point(0, D1.Y), new Point(B.X-B1.X, C.Y));
            xc2.Flush(ms, "image/png");
            using (System.Drawing.Image bmp = Bitmap.FromStream(ms))
            {
                xc.OverlayImage(bmp, new Point(B1.X, 0));
            }
        }
    }

    // image 3
    // distorted using A3D'D coordinate system
    using (MemoryStream ms = new MemoryStream())
    {
        using (Pacem.Drawing.Image xc3 = new Pacem.Drawing.Image(Server.MapPath("~/3.jpg")))
        {
            xc3.Distort(new Point(D1.X, 0), new Point(C1.X, 0), new Point(0, D.Y - D1.Y), new Point(C.X, C.Y - C1.Y));
            xc3.Flush(ms, "image/png");
            using (System.Drawing.Image bmp = Bitmap.FromStream(ms))
            {
                xc.OverlayImage(bmp, new Point(0, D1.Y));
            }
        }
    }

    // image 4
    using (MemoryStream ms = new MemoryStream())
    {
        using (Pacem.Drawing.Image xc4 = new Pacem.Drawing.Image(Server.MapPath("~/4.jpg")))
        {
            xc4.Distort(A, A1, D, D1);
            xc4.Flush(ms, "image/png");
            using (System.Drawing.Image bmp = Bitmap.FromStream(ms))
            {
                xc.OverlayImage(bmp, A);
            }
        }
    }

    // image 5
    using (MemoryStream ms = new MemoryStream())
    {
        using (Pacem.Drawing.Image xc5 = new Pacem.Drawing.Image(Server.MapPath("~/5.jpg")))
        {
            // using ResizeImage(width, height, mantainProportions) method
            xc5.ResizeImage(innerRect.Width, innerRect.Height, false);
            xc5.Flush(ms, "image/png");
            using (System.Drawing.Image bmp = Bitmap.FromStream(ms))
            {
                xc.OverlayImage(bmp, A1);
            }
        }
    }

    xc.Save(Server.MapPath("~/puzzle.png"), "image/png");
    xc.Dispose();
}

Codice, direi, abbastanza auto-esplicativo; diamo quindi un'occhiata al risultato:

result

Take care. Bye.

feedback
 

Syndicate

Autore

Cristian Merighi facebook twitter google+ youtube

Ultimi articoli

Top rated

Archivio

Dove sono?

Autore

Cristian Merighi facebook twitter google+ youtube

Le mie letture

Feeds