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....