Autor Tema: hBitmap/hDIB Top-Down o Bottom-Up  (Leído 5640 veces)

0 Usuarios y 1 Visitante están viendo este tema.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
hBitmap/hDIB Top-Down o Bottom-Up
« en: Febrero 12, 2017, 10:53:27 am »
Hola chicos alguien sabe como identificar si un hBitmap/hDIB esta invertido (Bottom-Up)? según este articulo obteniendo la esctructura BITMAPINFOHEADER en el  biHeight estaría la lo que busco, si biHeight  es negativo la imagen esta invertida, de lo contrario si es positivo esta normal, el problema es que siempre me retorna positivo, (tal como lei en otros artículos en internet)

ya hice muchos intentos con GetDIBits, GetObject con la estructura BITMAP y con la estructura DIBSECTION, pero en todos los casos y formas todos los datos de las estructuras dan los mismos valores para una imagen con Top-Down o Bottom-Up

se que sin la función que retorna el hDIB es un poco difícil de contestar la pregunta pero escucho sugerencias.

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #1 en: Febrero 12, 2017, 08:07:20 pm »
Si, si el valor es negativo las líneas comienzan de abajo hacia arriba.

Pero OJO, eso quiere decir que en el fichero se guardan así.
No debe confundirse (probablemente esta sea la causa de que te dé siempre lo mismo), con que tu hagas un espejo vertical a la imagen y la guardes... Cuando se modifica una imagen, se considera que el resultado es correcto, y no se guarda considerando si la has invertido o rotado 90º, se guarda así y así debe aparecer la próxima vez que se cargue y visualice.
...ya que se guardará con valores positivos o negativos (depende del códec utilizado).

Un modo de verificarlo es leer tu mismo los ficheros BMP, para constatar que efectivamente algunas imágenes se guardan así...

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #2 en: Febrero 12, 2017, 09:32:32 pm »
Hola NEBIRE para ampliar un poco, tengo una funcion que me retorna el handle de un Bitmap, el cual lo quiero pasar a GDI+ para ello utilizao una funcion GdipCreateBitmapFromScan0  y bien en algunos casos la imagen se muestra correctamente y en otrs me queda Pata pa arriba (hablando en criollo)  ahora si yo este Bitmap lo paso a un imagelist y luego con ImageList.Draw la imagen siempre se pinta correctamente por lo que supongo que el imagelist sabe cuando esta invertido, si yo supiera cuando el bmp esta invertido lo puedo flipear tranquilmanete mi duda es esa como el imagelist detecta eso.
como aclare antes en todas las pruebas que hice BITMAPINFOHEADER.biHeight  siempre es positivo.

voy armar algun ejemplo para subir. asi es mas facil de mostrar.

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #3 en: Febrero 13, 2017, 12:02:51 pm »
Ok... mejor un poco de código, que poder revisar.

Yo creo tener por ahí algún viejo proyecto que leía BMP, de cuando los monitores solo eran capaces de reperesentar 256 colores y por ello se usaba mucho la parte de la estructura que leía la paleta de colores usados... es de esos proyectos que aún conservan aquellas esencias arcaicas de cómo y porqué eran las cosas que a veces hoy nos sorprende.
Seguramente en él, lo puse para leer (y pintar al mismo tiempo que leía) con el bucle desde el final, ya que entonces era la norma común... a ver si lo encuentro y lo actualizo un poco...

p.d.:
Y bueno, si no lo encuentro monto alguno en un rato y listo...
« última modificación: Febrero 13, 2017, 12:05:40 pm por NEBIRE »

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #4 en: Febrero 13, 2017, 09:01:38 pm »
Si, si el valor es negativo las líneas comienzan de abajo hacia arriba.
Perdón Leandro, es al revés...

Por defecto el valor es positivo y se lee de abajo-arriba, cuando el valor es negativo se lee de arriba-abajo.


-----
Buscando, ese viejo proyecto, no lo encuentro en este disco, seguramente lo tengo en alguno otro disco más viejo, aunque hace poco recuerdo haberlo visto y por eso creía tenerlo en este. De todos modos, montaré algo rápido mañana, para probar aunque solo sea con un bitmap de 256 colores, para no demorarme... o quizás antes de dormirme esta noche si termino lo que tengo entre manos.


LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #5 en: Febrero 13, 2017, 09:05:06 pm »
Hola Finalmente pude resolverlo, mientras armaba el ejemplo salto la solución y bueno mi error era llamar a GetObject DIBSECTION  y al parecer la imagen tenia una compresión la cual debía utilizar GetDIBits para que biCompression tenga un valor y luego si GetDIBits  para obtener el array de bits de la imagen. (un quilombo explicarlo)

Así que bien aca esta el ejemplo del que hablaba con las formas que intente la cuarta es la que me sirve.

http://workupload.com/file/uG2FFND

Saludos y gracias

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #6 en: Febrero 14, 2017, 12:58:49 am »
No he podido ejecutarlo, me salta un error sobre una función de la Tlb, no encuentra el punto de entrada a la fnción SHCreateItemFromIDList en shell32... probablemente tengas otra versión más actual que la que tengo yo de shell32.

He montado algo rápido, para probar la lectura de las líneas, mañala lo termino y lo subo.


LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #7 en: Febrero 14, 2017, 02:38:05 am »
No he podido ejecutarlo, me salta un error sobre una función de la Tlb, no encuentra el punto de entrada a la fnción SHCreateItemFromIDList en shell32... probablemente tengas otra versión más actual que la que tengo yo de shell32.

He montado algo rápido, para probar la lectura de las líneas, mañala lo termino y lo subo.

que raro si no me equivoco tenes Windows 7, tengo entendido que SHCreateItemFromIDList  es para windows vista y superiores, por lo que no debería haber problemas, supongo que vos recargaste el tlb ya que puede que te apunte a una carpeta donde yo lo tenia registrado. pero en fin si es por eso ya te habría saltado en las declaraciones.
ok espero  mañana para ver eso.

NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #8 en: Febrero 14, 2017, 04:22:22 pm »
Bueno anoche saqué un momentito y otro ahora...
Es un boceto de proyecto no terminado, pero aún así permite cargar bmp 8 bits...
He añadido, lo que vendría a ser un códec BMP (para desarrollar en el tiempo), sobre una clase...
Desde el módulo, se carga y visualiza la imagen, desde la clase, ambas funciones están separadas (cada una se llama desde sendos menús), la carga sería similar a un GetObject, y la de dibujado a Bitblt....
Con el tiempo escaso que le he dedicado, esto es lo que he hecho, y para demostrar que Height es positivo y que se carga de abajo-arriba es suficiente.
Hay que notar, como los bucles establecen el punto de inicio a la altura de la imagen y se va reduciendo hasta llegar a la línea 1 (step-1), mientras en el fichero se va leyendo secuencialmente haci adelante (byte a byte en el módulo, y línea a línea en la clase).

http://workupload.com/file/ZYAfDsL  92kb. comprimido. (incluye una imagen de prueba, pero vale cualquiera que sea de 8bits).

-----------------------------------------------
p.d.: No, aquí en casa tengo un XP...
« última modificación: Febrero 14, 2017, 04:25:07 pm por NEBIRE »

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:hBitmap/hDIB Top-Down o Bottom-Up
« Respuesta #9 en: Febrero 15, 2017, 01:17:40 pm »
interesante NEBIRE es un método nativo de la lectura de un bmp, y si si dibujas de abajo hacia arriba con lineas, gracias por el aporte.

Saludos.