Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Leer Pixeles De Una Imagen Cargada En Memoria

Iniciado por [EX3], 10 de Mayo de 2005, 04:32:31 AM

« anterior - próximo »

[EX3]

 Wenas. Hace poco comprobe lo horrosamente lenta que era mi funcion de lectura de pixeles implementada en D3D, funcion que usaba generalmente para interpretar mapas de durezas para un juego plataformas en 2D, y me decidi por implementar un pequeño sistema de mapas de durezas mediante el GDI de Windows usando la funcion GetPixel(). El tema es que no logro hacerlo bien y es que en realidad no me ha quedado muy clara la cosa. Estuve mirando en el API-Guide las funciones para trabajar con los graficos y demas, encontre la funcion LoadImage() pero esta no me devuelve un hDC (controlador de dispositivo), que es lo que preciso para poder leer pixeles con GetPixel(), si no un controlador de mapa de bit (hBM). Por mas que miro los ejemplos no encuentro ninguno que mezcle el uso de GetPixel() con LoadImage() y con la informacion que encuentro no saco nada en claro. Alguien podria explicarme como se haria para acceder al hDC de la imagen cargada con LoadImage() y asi poder leer sus pixeles con GetPixel()?

Gracias.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

[EX3]

 
CitarEl que la sigue la consigue
Vale, curioseando un rato mas en el API-Guide, mirando a voleo, encontre la solucion, SelectObject()
Option Explicit

Const LR_LOADFROMFILE = &H10
Const IMAGE_BITMAP = 0

Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long

Dim hDC As Long, hBMP As Long, Color As Long

Sub Main()
hDC = CreateCompatibleDC(0)
hBMP = LoadImage(ByVal 0&, App.Path & "\lev01room01.bmp", IMAGE_BITMAP, 768, 512, LR_LOADFROMFILE)

Call SelectObject(hDC, hBMP)

Color = GetPixel(hDC, 370, 407)

Call MsgBox("Pixel 370,407: " & Color, vbInformation)

Call DeleteObject(hBMP)
Call DeleteDC(hDC)
End Sub

Ahora si me funciona a la perfeccion :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Lord Trancos 2

 ¿Has hecho pruebas de velocidad? Me da a mi que GetPixel es (tambien) muy lenta.

Yo lo que haria seria cargar las imagenes de forma "manual" en memoria (usa algun formato descromprimido y facil de leer como BMP, TGA...), y despues hacerme mi propia funcion getpixel.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

[EX3]

 
Cita de: "Lord Trancos 2"¿Has hecho pruebas de velocidad? Me da a mi que GetPixel es (tambien) muy lenta.
De 63fps leyendo un solo pixel en cada vuelta del bucle con con D3D y a 5fps leyendo 5 pixeles frente a los  a 286fps leyendo un pixel en cada vuelta del bucle con GDI y a 269fps leyendo 16 pixeles... no se, yo creo que si rinde bien en comparacion con mi funcion en D3D :)

Para no ocupar mucha memoria, estoy usando BMPs a 16 colores, que para leer colores como el rojo, verde y azul suficiente, y estoy mirando usar BMPs de 16 colores pero con la mitad de tamaño, como hacian en Div2, ya que preciso un mapa de dureza por cada habitacion del nivel.

GetPixel() rinde mejor de lo que parece.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Lord Trancos 2

 GetPixel es lenta, otra cosa es que para lo que quieras te valga, pero es MUY lenta.

Lo que pasa es que en D3D probablemente estabas bloqueando y accediendo a memoria de video y eso SI es tremendamente lento.

Puedes acceder a la memoria de la imagen bitmap usando la funcion del API GetDiBits.

Aqui tienes un ejemplo de como acceder, leer y modificar:
http://www.vb-helper.com/howto_make_gray.html
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Topper

 Yo pasaría de GetPixel en tiempo real. Es mejor hacer un preprocesamiento de la imagen y guardar los valores que necesites en tu propio array para su acceso posterior.  Será infinitamente más rápido, te lo aseguro. El único "problema" puede ser el consumo doble de memoria para este array  <_<

Saludos.

Lord Trancos 2

 Cosumo doble?

Es un mapa de durezas. Se carga la imagen, se guarda en un array y se libera la imagen (ya no hace falta para nada mas...).
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

[EX3]

 GetPixel() es lenta para hacer burradas, en esto estoy deacuerdo, pero como tu dices, para lo que preciso que es leer un pixel o 2 por cada proceso que ejecuto en el bucle principal me basta de sobra. El ejemplo que me has puesto con GetDiBits() lo veo un tanto extenso y es cargar demasiados datos en el programa, me refiero a las variables en el codigo, que luego no preciso y creo que el rendimiento sera similar al de GetPixel().

Topper, ya pense en hacer lo del array personalizado con el contenido del mapa pero mirando el tema como tu dices me iba a ocupar mas en memoria que usando el metodo actual con GetPixel(), ademas, no me interesa descartar valores del mapa ya que preciso el mapa entero para los procesos pueda leerlo segun su posicion en el escenario ya que el mapa de durezas define las zonas del escenario que usaran las entidades: piso, paredes y techo de los niveles, un ejemplo:

El escenario en PNG pesa 31.1kb (en memoria descomprimido sera 1.12 mb aprox.) y el mapa de durezas BMP 16 colores 192kb, ambos a 768x512 de tamaño.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Topper

 
Citar
Cosumo doble?

Es un mapa de durezas. Se carga la imagen, se guarda en un array y se libera la imagen (ya no hace falta para nada mas...).

Por eso digo, consumo doble en algún momento siempre habrá  :P  

zxs

 coño, ¿y donde me has dejado al león o al bicho aquel que salía?

en esas geniales capturas de pantalla del no menos genial...


¿ANOTHER WORLD? !!!que recuerdos!!!

[EX3]

 
Cita de: "zxs"coño, ¿y donde me has dejado al león o al bicho aquel que salía?

en esas geniales capturas de pantalla del no menos genial...


¿ANOTHER WORLD? !!!que recuerdos!!!
El leon esta echando la siesta en la otra punta del nivel y al prota lo deje castigado entre bastidores (joer lo que me costo que se quedara fuera de la escena para sacar la captura xDD)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.