コード例 #1
0
        private static void WarpImage(WarpOperace warp_op)
        {
            // Generovat v�sledek pro ka�d� v�stupn� pixel
            for (int y = 0; y < B2.Height; y++)               // cyklus p�es ��dky nov�ho obr�zku
            {
                for (int x = 0; x < B2.Width; x++)            // cyklus p�es sloupce nov�ho obr�zku
                {
                    double du, dv;                            // odpov�daj�c� sou�adnice v p�v. obr.
                    MapPixel(warp_op, x, y, out du, out dv);  // mapov�n� jednotliv�ch pixel� (x, y do u, v) - double pro v�po�ty

                    // Interpolace k z�sk�n� v�sledn� hodnoty pixelu
                    int iu = (int)du;                                       // integer - cel� ��st
                    int iv = (int)dv;

                    // Vyhod� pixely mimo obraz                             // rozm�ry star�ho obr�zku
                    if ((iu < 0) || (iu > B1.Width - 2) || (iv < 0) || (iv > B1.Height - 2))
                    {
                        B2.SetPixel(x, y, Color.White);                     // bod je mimo obr�zek - vybarv�me b�le
                    }
                    else                                                    // bod je uvnit� obr�zku - spo�teme jeho hodnotu
                    {
                        // vzd�lenosti od sousedn�ch pixel� (du je p�esn� hosnota, iu cel� ��slo)
                        double u0 = du - iu;                                  // od lev�ho pixelu
                        double v0 = dv - iv;                                  // od horn�ho
                        double u1 = 1 - u0;                                   // od prav�ho
                        double v1 = 1 - v0;                                   // od spodn�ho

                        byte  r1, g1, b1, r2, g2, b2, r3, g3, b3, r4, g4, b4; // barvy sousedn�ch pixel� do rij, gij, bij (i,j=0,1)
                        Color c;
                        c  = B1.GetPixel(iu, iv);                             // vlevo naho�e
                        r1 = c.R; g1 = c.G; b1 = c.B;
                        c  = B1.GetPixel(iu, iv + 1);                         // vlevo dole
                        r2 = c.R; g2 = c.G; b2 = c.B;
                        c  = B1.GetPixel(iu + 1, iv);                         // vpravo naho�e
                        r3 = c.R; g3 = c.G; b3 = c.B;
                        c  = B1.GetPixel(iu + 1, iv + 1);                     // vpravo dole
                        r4 = c.R; g4 = c.G; b4 = c.B;

                        // biline�rn� interpolace: v�po�et v�en�ho pr�m�ru
                        // ry1 = r1*dy1 + r2*dy0, ry2 = r3*dy1 + r4*dy0,   r = ry1*dx1 + ry2*dx0
                        int r = (int)(r1 * u1 * v1 + r2 * u1 * v0 + r3 * u0 * v1 + r4 * u0 * v0);
                        int g = (int)(g1 * u1 * v1 + g2 * u1 * v0 + g3 * u0 * v1 + g4 * u0 * v0);
                        int b = (int)(b1 * u1 * v1 + b2 * u1 * v0 + b3 * u0 * v1 + b4 * u0 * v0);
                        B2.SetPixel(x, y, Color.FromArgb(255, (byte)r, (byte)g, (byte)b));
                    }
                }
            }
        }