• Lunes 23 de Diciembre de 2024, 12:45

Autor Tema:  Bmps En Visual C  (Leído 2427 veces)

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Bmps En Visual C
« en: Jueves 12 de Enero de 2006, 19:29 »
0
Hola saludos o todos. :hola:

saben, hace tiempo tuve que hacer un puqueño programa de procesamiento de imagenes, cargaba un bmp y le aplicaba algunas tecnicas, deteccion de bordes y cosas asi.  :hola:

El problema es que era lento porque cargaba el bmp y lo pegaba en la ventana, para posteriomente procesar pixel a pixel con las funciones Getpixel y Putpixel,
 :unsure:
quisiera saber si hay alguna forma de cargar el bmp y guardarlo en la memoria como una matriz , procesarlo en memoria y luego pegar el bmp procesado algo asi como lo que hace matlab

pascalgames

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
    • http://fer.htmlplanet.com/proyecto.htm
Re: Bmps En Visual C
« Respuesta #1 en: Lunes 23 de Enero de 2006, 05:00 »
0
si hay con direct x es la que se, y usando un arreglo en la memoria(dinamico)

hay que leer el encabezado del bmp me parece que mide 1024 o 1078 y a partir de alli ay que leer la imagen byte a byte depende del formato

cada linea del bmp es de abajo a arriba es decir la primer linea que visualizas esta hasta el final del archivo y ademas de esto si el ancho del dibujo no es multiplo de 4 (en pixeles no en bytes)  estara relleno de bytes hasta completar el numero multiplo de 4


   ejemplo

1078 bytes de cabezera (info, ancho, alto, colores , etc)

la imagen mide 3 x 3

- - -
- - -
- - -
pero en ves de eso cada linea tendra 4 pixeles en ves de 3(por que tiene que se multiplo de 4

3- - - -
2- - - -
1- - - -


y se leera de abajo a arriba

y ademas cada pixel se compondra de 1 byte (en caso de 256 colores)

2 bytes en caso de 16 bits por pixel, 3 bytes en el caso de 24 bits y 4 bytes en el caso de 32 bits


y si es de 256 colores tienes que cargar la paleta que estara en los primeros 1078 bytes


la paleta mide 768 bytes
y si no es de 256 colores creo que el encabezado medira 1078 bytes - 768 bytes ...

bueno no me acuerdo bien pero todo lo tengo apuntao por que hice cargadores de bmp para pascal , c, visual c en todos los formatos, escepto comprimido


no se explicar mucho pero igual buscare los codigos para pasarlos...

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Bmps En Visual C
« Respuesta #2 en: Lunes 23 de Enero de 2006, 16:28 »
0
Cita de: "allisap"
Hola saludos o todos. :hola:

saben, hace tiempo tuve que hacer un puqueño programa de procesamiento de imagenes, cargaba un bmp y le aplicaba algunas tecnicas, deteccion de bordes y cosas asi.  :hola:

El problema es que era lento porque cargaba el bmp y lo pegaba en la ventana, para posteriomente procesar pixel a pixel con las funciones Getpixel y Putpixel,
 :unsure:
quisiera saber si hay alguna forma de cargar el bmp y guardarlo en la memoria como una matriz , procesarlo en memoria y luego pegar el bmp procesado algo asi como lo que hace matlab
Yo he trabajado bastante con ese tema, pero en delphi. En delphi tienes una propiedad scanline, que te devuelve un puntero a una fila, con eso aceleras muchisimo el proceso de tratamiento de imagenes. En C++ seguramente existe una propiedad similar que te permita trabajar con toda una linea a la vez. O bien puedes tener un puntero a toda la imagen y alguna informacion extra como cuantos bytes ocupa una linea de tu imagen para moverte a la linea deseada (a la manera de directX). De todos modos la forma mas rapida de procesar la imagen es hacerlo secuencialmente, evitas multiplicaciones innecesarias y a base de sumas e incrementos en un puntero que apunte al pixel que estas trabajando vas analizando toda la imagen.

En la seccion de delphi subi una clase que permite crear un bitmap en memoria y trabajarlo directamente con un puntero, en base a llamadas estandar de windows que son iguales en C++ y en delphi, asi que no deberias tener problemas en utilizar el ejemplo como base.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Bmps En Visual C
« Respuesta #3 en: Martes 7 de Marzo de 2006, 15:42 »
0
Para acelerarlo lo que deberías hacer es trabajar con el puntero a la información del mapa de bits, no he usado la WinApi, pero hice un pequeño programa que carga un mapa de bits y lo almacena en memoria como lo menciona pascalgames, ¿cómo hiciste tú para cargar la imagen?

Si usaste alguna función que te devuelve una estructura, checa en dicha estructura la manera en que se guarda la información de la imagen (generalmente será un puntero a los bytes de la imagen), con eso puedes trabajar y será más rápido que utilizar PutPixel y GetPixel (yo hice la prueba utilizando las funciones putpixel y getpixel de la librería Allegro y luego haciéndolo "manualmente" y si, definitivamente es más rápido trabajar directamente con el puntero.

Saludos,
José Jorge (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Bmps En Visual C
« Respuesta #4 en: Martes 7 de Marzo de 2006, 17:13 »
0
bueno, la carga del bmp la hago con LoadImage,que es una funcion API, :)

¿Se puede cargar el bmp desde directx?,  :unsure:

he cargado imagenes en bmp y jpg para juegos usandolos como sprites,  solo las cargo y las pego, pero como guardo la informacion de los pixels de la imagen para procesarlas
creo que haria las operaciones mas rapido,