• Miércoles 20 de Noviembre de 2024, 12:21

Autor Tema:  Mamdar Un Pixel En Pantalla  (Leído 2639 veces)

LeGatoRojo

  • Miembro HIPER activo
  • ****
  • Mensajes: 552
  • Nacionalidad: mx
    • Ver Perfil
    • LeGatoRojo
Mamdar Un Pixel En Pantalla
« en: Viernes 8 de Octubre de 2004, 10:23 »
0
Saben ya se usar como se usan los colores en 15 bits, pero quisiera saber como hago que la computadora mande un pixel en pantalla desde c++, saben ya habia hecho mi libreria de 256, pero quiro que abarque mas.
Un día desperte y en lugar de dientes tenía colmillos, en lugar de manos, tenía garras; pero lo más impactante fue el color escarlata de mi pelaje.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Mamdar Un Pixel En Pantalla
« Respuesta #1 en: Viernes 8 de Octubre de 2004, 16:38 »
0
De esa forma es muy lento (pixel por pixel). Lo mejor es enviar toda la imagen lista a la memoria de video que refresca la pantalla o por lo menos una buena parte de la imagen.

Lo siguiente es una vista a "vuelo de pájaro" de como hacerlo con el GDI pero ahí va:

Para realizar esto de forma rápida puedes valerte del DirectX (con el lock/unlock) o del GDI de windows mediante el BitBlt. (Es decir que lo no haces "personalmente", sino mediante una biblioteca de funciones que al final usará los drivers del fabricante de la tarjeta de video para asegurarte velocidad en la transferencia de memoria.)

El BitBlt permite copiar la imagen de un "HDC" a otro realizando conversión de profundidad de color, poniendo tu superficie de 15 bits en memoria a otra de  8,15,16,24 o 32 bits.

HDC : handle of device context, un puntero a una estructura que define un conjunto de objetos gráficos del GDI.

Código: Text
  1.  
  2. BOOL BitBlt(
  3.     HDC  hdcDest,  // handle of destination device context
  4.     int  nXDest,  // x-coordinate of destination rectangle's upper-left corner
  5.     int  nYDest,  // x-coordinate of destination rectangle's upper-left corner
  6.     int  nWidth,  // width of destination rectangle
  7.     int  nHeight,  // height of destination rectangle
  8.     HDC  hdcSrc,  // handle of source device context
  9.     int  nXSrc,  // x-coordinate of source rectangle's upper-left corner  
  10.     int  nYSrc,  // y-coordinate of source rectangle's upper-left corner
  11.     DWORD  dwRop   // raster operation code
  12.    );
  13.  
  14.  

En Delphi existe un objeto llamado TBitmap que encapsula el GDI de windows, haciendo las cosas más fáciles (recuperar, escribir archivos .BMP, acceso a la misma imagen para edición, etc). Así que en la versión de compilador C++ que estas usando existirá algún objeto que encapsule el GDI.

Utilizando los objetos que encapsulan el GDI podrás obtener el HDC del bitmap que quieres poner en pantalla utilizando el bitblt o también acceder al área de memoria de la imagen que es mucho mejor que sea un DIB "Device Independet Bitmap" para como su nombre dice evitar que el bitmap sea dependiente de la profundidad de color de la resolución actual de la pantalla.

LeGatoRojo

  • Miembro HIPER activo
  • ****
  • Mensajes: 552
  • Nacionalidad: mx
    • Ver Perfil
    • LeGatoRojo
Re: Mamdar Un Pixel En Pantalla
« Respuesta #2 en: Domingo 10 de Octubre de 2004, 03:13 »
0
Cita de: "Amilius"
De esa forma es muy lento (pixel por pixel). Lo mejor es enviar toda la imagen lista a la memoria de video que refresca la pantalla o por lo menos una buena parte de la imagen.

Lo siguiente es una vista a "vuelo de pájaro" de como hacerlo con el GDI pero ahí va:

Para realizar esto de forma rápida puedes valerte del DirectX (con el lock/unlock) o del GDI de windows mediante el BitBlt. (Es decir que lo no haces "personalmente", sino mediante una biblioteca de funciones que al final usará los drivers del fabricante de la tarjeta de video para asegurarte velocidad en la transferencia de memoria.)

El BitBlt permite copiar la imagen de un "HDC" a otro realizando conversión de profundidad de color, poniendo tu superficie de 15 bits en memoria a otra de  8,15,16,24 o 32 bits.

HDC : handle of device context, un puntero a una estructura que define un conjunto de objetos gráficos del GDI.

Código: Text
  1.  
  2. BOOL BitBlt(
  3.     HDC  hdcDest,  // handle of destination device context
  4.     int  nXDest,  // x-coordinate of destination rectangle's upper-left corner
  5.     int  nYDest,  // x-coordinate of destination rectangle's upper-left corner
  6.     int  nWidth,  // width of destination rectangle
  7.     int  nHeight,  // height of destination rectangle
  8.     HDC  hdcSrc,  // handle of source device context
  9.     int  nXSrc,  // x-coordinate of source rectangle's upper-left corner  
  10.     int  nYSrc,  // y-coordinate of source rectangle's upper-left corner
  11.     DWORD  dwRop   // raster operation code
  12.    );
  13.  
  14.  

En Delphi existe un objeto llamado TBitmap que encapsula el GDI de windows, haciendo las cosas más fáciles (recuperar, escribir archivos .BMP, acceso a la misma imagen para edición, etc). Así que en la versión de compilador C++ que estas usando existirá algún objeto que encapsule el GDI.

Utilizando los objetos que encapsulan el GDI podrás obtener el HDC del bitmap que quieres poner en pantalla utilizando el bitblt o también acceder al área de memoria de la imagen que es mucho mejor que sea un DIB "Device Independet Bitmap" para como su nombre dice evitar que el bitmap sea dependiente de la profundidad de color de la resolución actual de la pantalla.
ja creo que no me explique del todo  :P , sabes yo lo queria hacer desde turbo c++, y queria mandar un pixel, no una imagen.
Un día desperte y en lugar de dientes tenía colmillos, en lugar de manos, tenía garras; pero lo más impactante fue el color escarlata de mi pelaje.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Mamdar Un Pixel En Pantalla
« Respuesta #3 en: Domingo 10 de Octubre de 2004, 15:19 »
0
Para poner un pixel en turboC , se usa la funcion putpixel.
Sino, entonces tienes varias opciones:

1 - usar la api de windows
2 - usar un libreria, como por ejemplo directX, allegro, SDL etc
3 - Usar directamente las funcionalidades del driver de la tarjeta
4 - Hacer un driver
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

LeGatoRojo

  • Miembro HIPER activo
  • ****
  • Mensajes: 552
  • Nacionalidad: mx
    • Ver Perfil
    • LeGatoRojo
Re: Mamdar Un Pixel En Pantalla
« Respuesta #4 en: Martes 2 de Noviembre de 2004, 08:02 »
0
Cita de: "JuanK"
Para poner un pixel en turboC , se usa la funcion putpixel.
Sino, entonces tienes varias opciones:

1 - usar la api de windows
2 - usar un libreria, como por ejemplo directX, allegro, SDL etc
3 - Usar directamente las funcionalidades del driver de la tarjeta
4 - Hacer un driver
bien bien, gracias, ahora tengo una nueva pregunta, como hago por ejemplo mi propia funcion putpixel, mas bien como hago mi propio driver
Un día desperte y en lugar de dientes tenía colmillos, en lugar de manos, tenía garras; pero lo más impactante fue el color escarlata de mi pelaje.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Mamdar Un Pixel En Pantalla
« Respuesta #5 en: Miércoles 3 de Noviembre de 2004, 06:24 »
0
Para usar tu poria funcion putpixel tienes varios caminos...
hablemos solo de win32

1- Usar la api y hacerlo a travez de gdi
2- Usar la api y acceder al dispositivo a travez  de.. como se llama.. como algo asi como DDI
3- Usar el DDK y crear tu propio driver
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io