Ecco il codice definitivo, testato su ogni tipo di bitmap: funziona sempre, sempre e sempre. L'ho racchiuso in un metodo statico (tanto per farmi il bello...


codice:
       //Preleva una porzione da una bitmap su disco definita da un rectangle di origine (x0,y0)
        //e dimensioni (dimx,dimy) che restituisce in una bitmap in memoria.
 
        public static Bitmap GetBmp(string path, int x0, int y0, int dimx, int dimy)
        {
            Vector4 Data = GetData(path);
            int Dim1 = (int)Data.X;
            int Dim2 = (int)Data.Y;
            int Bits = (int)Data.Z;
            int Ofs = (int)Data.W;

            byte[] a = GetAll(path);

            int truewidth = (int)((Bits * Dim1 + 31) / 32) * 4;

            Bitmap b2 = new Bitmap(dimx, dimy);
            int Ptr = 0, R, G, B;
            for (int y = y0; y < y0 + dimy; y++)
                for (int x = x0; x < x0 + dimx; x++)
                {
                    Ptr = Ofs +  (Bits/8)*x + truewidth * (Dim2 - y - 1);
                    B = Convert.ToInt32(a[Ptr]);
                    G = Convert.ToInt32(a[Ptr + 1]);
                    R = Convert.ToInt32(a[Ptr + 2]);
                    b2.SetPixel(x - x0, y - y0, System.Drawing.Color.FromArgb(R, G, B));
                }
            return b2;
        }
Ma no, a me serve per esempio una regione di 500x500 pixel per volta, da prelevare però da una mappa immensa (tipo 10000 o 20000 px lato, ma ora chi mi ferma più? Anche 50000 px lato, tanto ci mette sempre lo stesso tempo (questo è il bello) e in memoria ci sta solo la Region....