private unsafe Bitmap PobierzObraz(int x, int y, Bitmap b) { Wielkość = new Size(x, y); Bitmap zwracana = new Bitmap(x, y); BitmapData bd = zwracana.LockBits(new Rectangle(0, 0, x, y), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb); RGB * MiejsceZapisane = (RGB *)bd.Scan0; PointF MinimalnyXF = XNYN.NaPointF(); PointF MaksymalnyYF = XPYN.NaPointF(); PointF PrzesuniecieLewe = XNYP.Odejmij(XNYN).NaPointF().Dziel(y); PointF PrzesunieciePrawe = XPYP.Odejmij(XPYN).NaPointF().Dziel(y); for (int i = 0; i < y; i++) { PointF PunktPoStronieLewej = MinimalnyXF.Dodaj(PrzesuniecieLewe.Razy(i)); PointF PunktPoStroniePrawej = MaksymalnyYF.Dodaj(PrzesunieciePrawe.Razy(i)); PointF PrzesuniecieMiedzyStronami = PunktPoStroniePrawej.Odejmij(PunktPoStronieLewej).Dziel(x); for (int j = 0; j < x; j++, MiejsceZapisane++) { PointF p = PunktPoStronieLewej.Dodaj(PrzesuniecieMiedzyStronami.Razy(j)); * MiejsceZapisane = b.Weź(p).NaRgb(); } } zwracana.UnlockBits(bd); return(zwracana); }
private unsafe byte *PobierzObrazByte(int x, int y, Bitmap b) { //416 784 Wielkość = new Size(x, y); byte * zw = (byte *)System.Runtime.InteropServices.Marshal.AllocHGlobal(x * y); byte * zwk = zw; BitmapData bd = b.LockBits(new Rectangle(Point.Empty, b.Size), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); byte * początek = (byte *)bd.Scan0; int str = bd.Stride; PointF MinimalnyXF = XNYN.NaPointF(); PointF MaksymalnyYF = XPYN.NaPointF(); PointF PrzesuniecieLewe = XNYP.Odejmij(XNYN).NaPointF().Dziel(y); PointF PrzesunieciePrawe = XPYP.Odejmij(XPYN).NaPointF().Dziel(y); for (int i = 0; i < y; i++) { PointF PunktPoStronieLewej = MinimalnyXF.Dodaj(PrzesuniecieLewe.Razy(i)); PointF PunktPoStroniePrawej = MaksymalnyYF.Dodaj(PrzesunieciePrawe.Razy(i)); PointF PrzesuniecieMiedzyStronami = PunktPoStroniePrawej.Odejmij(PunktPoStronieLewej).Dziel(x); float Px = PunktPoStronieLewej.X, Py = PunktPoStronieLewej.Y; float PrzesuniecieX = PrzesuniecieMiedzyStronami.X, PrzesuniecieY = PrzesuniecieMiedzyStronami.Y; for (int j = 0; j < x; j++, zw++) { int X = (int)(PrzesuniecieX * j + Px); int Y = (int)(Py + j * PrzesuniecieY); if (X < 0 || Y < 0 || X >= b.Width || Y >= b.Height) { *zw = 0; continue; } byte *tmp = początek + str * Y + X * 3; RGB * r = (RGB *)tmp; int s = r->B + r->G + r->R; s /= 3; *zw = (byte)s; } } b.UnlockBits(bd); return(zwk); }