Quote Originariamente inviata da escocat Visualizza il messaggio
Quando avviene il trasferimento dei dati da b1 a M, b1 resta sul disco C no? Quindi tutta la memoria che ho usato è M?
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!

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?
Marshal.Copy serve a copiare dati da memoria a memoria, perché dovrebbe ridurti l'utilizzo di memoria?

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.
Leggo lo Stride di bdata e mi da 3 byte per pixel: perchè non 4? Il canale alfa che fine ha fatto?
Se il tutto deriva da un .BMP probabilmente hai salvato il PNG senza canale alpha...