2010-01-05 12 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; 
    } 

es necesario para conseguir permanecer por objetos de datoscualquiera puede explicar la función de zancada en bitmapdata?

+0

en el código dado anteriormente es necesario el uso de data.stride ¿cuál es su propósito básico? espero que pueda entender ahora – Badr

Respuesta

7

Stride está ahí debido a los requisitos de hardware que desafortunadamente se han filtrado a la capa API.

Es importante porque los controladores de Windows a veces requieren que las líneas de escaneo (filas en la imagen) estén alineadas con la memoria. Es por eso que a veces son más grandes de lo estrictamente necesario.

Consulte, por ejemplo, este artículo de MSDN DIBs and Their Use.

Cada línea de escaneo es DWORD -aligned. La línea de exploración se almacena temporalmente en la alineación; el almacenamiento en memoria intermedia no es necesariamente 0.

Parece que su manejo es suficiente.

+0

ok es bueno ahora thanx – Badr

+0

No creo que sea un requisito de hardware que se filtró porque existía zancada antes de que hubiera hardware de gráficos que podría hacer aceleración (blitting). Si no recuerdo mal, tenía más que ver con la optimización del rendimiento gráfico en las primeras PC donde todas las operaciones gráficas las realizaba la CPU.La razón obvia es facilitar la indexación de píxeles: hacer avanzar una potencia de 2 bytes y eliminar una multiplicación (que solía ser lenta) – Skizz

+0

Además, las primeras tarjetas de gráficos usaban planos de bits para almacenar el búfer de cuadros, lo que significaba la manera más fácil de almacenar las imágenes tenían que rellenar varias imágenes de ocho píxeles de ancho. Agradezca que ya no tenga que preocuparse por el hardware basado en un plano de bits. – Skizz

3

Scanlines normalmente se alinean en processor word límites.

http://javaboutique.internet.com/tutorials/rasters/index2.html tiene un buen diagrama.

Las personas que implementan mapas de bits accesibles a la CPU desean alinear sus líneas de escaneo en los límites de las palabras del procesador ya que los códigos de máquina para acceder y manipular las palabras del procesador pueden ser sustancialmente más rápidos que los de las direcciones no alineadas.

+0

necesito algunos detalles ..... – Badr

+0

gracias es útil – Badr

4

Stride es el número de bytes que debe recorrer el código para llegar al siguiente píxel vertical.

Esto puede ser diferente del tamaño de la imagen ancho * tamaño de píxel si el hardware requiere un ancho de cierto múltiplo.

+0

Seguramente deberían ser bytes para iterar en lugar de píxeles, ya que el desplazamiento desde el inicio de una línea de exploración a la siguiente no es necesariamente un múltiplo del tamaño de un píxel. Por ejemplo, una imagen de 24 bits que tiene 3 píxeles de ancho utiliza nueve bytes por fila de imagen, pero podría ajustarse a diez (3 1/3 píxeles) o doce bytes (4 píxeles). – Skizz

+0

Tiene razón. Editado –

1

Sí, es necesario.

El valor de zancada es el desplazamiento desde el inicio de una línea de exploración hasta el inicio de la siguiente línea de exploración. Si las líneas de escaneo están rellenas, el valor es unos pocos bytes más de lo que se necesita para los píxeles en la línea de escaneo.

Si el mapa de bits se almacena al revés en la memoria (es decir, la línea de exploración inferior primero), el valor de zancada es negativo. Si leyera dicho mapa de bits sin usar el valor de zancada, obtendría solo basura después de la primera línea de escaneo, o un error de acceso a la memoria.

1

El valor de zancada es el número de bytes que toma el mapa de bits para representar una fila de píxeles. por lo que podría mover un puntero de memoria hacia adelante por el paso grande para moverse hacia abajo una fila

Cuestiones relacionadas