No. Quando carichi un'immagine va tutta in memoria - il processore non sa lavorare direttamente con dati che stanno su disco, e in generale quando GDI+ carica un'immagine la tiene tutta in memoria in un formato indipendente dal formato di file specifico (che è l'unica cosa sensata da fare per molti formati compressi).
Ah scusate ho detto una fesseria, b1 è pure in memoria!
Marshal.Copy serve a copiare dati da memoria a memoria, perché dovrebbe ridurti l'utilizzo di memoria?Il fatto è che io ho una bitmap di 10000x10000 su disco ma un mio programma ne deve usare una porzione piccolissima per volta. Come posso fare? La Marshal.Copy fa al caso mio?
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.
Se il tutto deriva da un .BMP probabilmente hai salvato il PNG senza canale alpha...Leggo lo Stride di bdata e mi da 3 byte per pixel: perchè non 4? Il canale alfa che fine ha fatto?