Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: LeandroA 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 (https://msdn.microsoft.com/en-us/library/windows/desktop/dd407212(v=vs.85).aspx) 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.
-
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í...
-
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.
-
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...
-
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.
-
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
-
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.
-
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.
-
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...
-
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.