2010-01-05 16 views
6
 Bitmap bit1 = new Bitmap(bmpimg , width , height); 
     Bitmap bit2 = new Bitmap(bmp , width , height); 

     Bitmap bmpresult = new Bitmap(width , height); 

     BitmapData data1 = bit1.LockBits(new Rectangle(0 , 0 , bit1.Width , bit1.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); 
     BitmapData data2 = bit2.LockBits(new Rectangle(0 , 0 , bit2.Width , bit2.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); 
     BitmapData data3 = bmpresult.LockBits(new Rectangle(0 , 0 , bmpresult.Width , bmpresult.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); 

unsafe 
     { 
      int remain1 = data1.Stride - data1.Width * 3; 
      int remain2 = data2.Stride - data2.Width * 3; 
      int remain3 = data3.Stride - data3.Width * 3; 


      byte* ptr1 = (byte*)data1.Scan0; 
      byte* ptr2 = (byte*)data2.Scan0; 
      byte* ptr3 = (byte*)data3.Scan0; 

      for(int i = 0 ; i < height ; i ++) 
      { 
       for(int j = 0 ; j < width * 3 ; j ++) 
       { 
        ptr3[ 0 ] = (byte) (XOR_Operator(ptr1[ 0 ] , ptr2[ 0 ])); 
        ptr1 ++; 
        ptr2 ++; 
        ptr3 ++; 
       } 

       ptr1 += remain1; 
       ptr2 += remain2; 
       ptr3 += remain3; 
      } 


     } 

     bit1.UnlockBits(data1); 
     bit2.UnlockBits(data2); 
     bmpresult.UnlockBits(data3); 

     return bmpresult; 
    } 

è necessario ottenere rimarrà per Data ObjectsQualcuno può spiegare la funzione di passo in bitmapdata?

+0

nel codice sopra riportato è necessario utilizzare data.stride qual è il suo scopo di base? spero che tu possa capire ora – Badr

risposta

7

La scalata è dovuta ai requisiti hardware che sono sfortunatamente sfuggiti al livello API.

È importante perché i driver di Windows a volte richiedono che le linee di scansione (righe nell'immagine) siano allineate in memoria. Questo è il motivo per cui a volte sono più grandi di quanto dovrebbero essere rigorosamente.

Vedere ad esempio questo articolo MSDN DIBs and Their Use.

Ogni riga di scansione è DWORD -allineata. La scanline viene memorizzata nel buffer per l'allineamento; il buffering non è necessariamente 0.

Il trattamento sembra essere sufficiente.

+0

ok va bene ora thanx – Badr

+0

Non penso che sia un requisito hardware che è trapelato perché il passo esisteva prima che ci fosse l'hardware grafico che poteva fare accelerazione (blitting). Se ricordo bene, si trattava più dell'ottimizzazione delle prestazioni grafiche nei primi PC in cui tutte le operazioni grafiche venivano eseguite dalla CPU.L'ovvia ragione è rendere l'indicizzazione dei pixel più semplice: aumentare la potenza di 2 byte ed eliminare un multiplo (che prima era lento) – Skizz

+0

Inoltre, le prime schede grafiche utilizzavano i bitplan per memorizzare il frame buffer, il che significava il modo più semplice per archiviare le immagini consistevano nel riempirle su più di otto immagini in pixel. Siate grati di non aver più bisogno di preoccuparsi dell'hardware basato su bit plane. – Skizz

3

Scanlines sono tipicamente allineati su processor word confini.

http://javaboutique.internet.com/tutorials/rasters/index2.html ha un bel diagramma.

Persone che attua bitmap CPU accessibile da allineare le linee di scansione su confini di parola processore come i codici macchina per l'accesso e la manipolazione parole processore può essere sostanzialmente più veloce rispetto a quelli per gli indirizzi non allineati.

+0

ho bisogno di alcuni dettagli ..... – Badr

+0

grazie il suo utile – Badr

4

Stride è il numero di byte che il codice deve scorrere per raggiungere il pixel verticale successivo.

Questo può essere diverso da dell'immagine * dimensione pixel se l'hardware richiede una larghezza di un certo multiplo.

+0

Sicuramente i byte dovrebbero essere iterati anziché pixel poiché l'offset dall'inizio di una scanline alla successiva non è necessariamente un multiplo della dimensione di un pixel. Ad esempio, un'immagine a 24 bit larga 3 pixel utilizza nove byte per riga immagine, ma potrebbe essere riempita fino a dieci (3 1/3 pixel) o dodici byte (4 pixel). – Skizz

+0

Sei corretto. Modificato. –

1

Sì, è necessario.

Il valore di falcata rappresenta l'offset dall'inizio di una linea di scansione all'inizio della successiva linea di scansione. Se le linee di scansione sono riempite, il valore è qualche byte in più rispetto a quello necessario per i pixel nella linea di scansione.

Se la bitmap viene memorizzata capovolta in memoria (vale a dire prima la linea di scansione inferiore), il valore di passo è negativo. Se si leggesse tale bitmap senza utilizzare il valore di falcata, si otterrebbe solo la spazzatura dopo la prima riga di scansione o un errore di accesso alla memoria.

1

Il valore di passo è il numero di byte che la bitmap impiega per rappresentare una riga di pixel. in modo da poter spostare un puntatore di memoria in avanti dal passo per scendere una riga

Problemi correlati