예제 #1
0
        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);
        }
예제 #2
0
        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);
        }