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)); } } } }