Una soluzione semplice al tuo problema può essere dividere manualmente la tua immagine in 100 tiles quadrate (diciamo 1000x1000) e caricare solo quelle necessarie per ricostruire il pezzo di immagine che ti interessa
Non è così semplice, la porzione che mi interessa varia in continuazione e l'origine del rectangle può essere un punto qualsiasi della mappa hires. Comunque credo di aver risolto in questo modo:
1) Partendo dalla mia mappa hires (la bitmap 10000x10000 o 30000x30000 per intenderci) leggo tutti i pixel e i tre byte R,G,B.
2) Mi creo un files di byte che contiene tutti i valori RGB dei pixel: ogni pixel occupa 3 byte.
3) E' nota la relazione tra pixel (x,y) e puntatore Ptr del primo byte di ogni gruppo di 3 byte nel file: Ptr = 3*(x + Dim1*y)
4) In base alla parte che devo estrarre (sottoinsieme di valori x, y della mappa hires) vado a prelevare nel file i byte che mi interessano e leggendo i valori contenuti nei byte ricostruisco la bitmap (partizione) corrente. In questo modo in memoria, ad ogni istante, ho solo la piccola bitmap estratta. Sto facendo fare tutto questo lavoro ad una classe Pxl (pixel) che ho scritto per ottimizzare il codice. Se a qualcuno interessa posso allegare il codice Pxl.