• Lunes 23 de Diciembre de 2024, 04:46

Autor Tema:  Unir Dos Imagenes Bit A Bit  (Leído 5995 veces)

javi_66

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Unir Dos Imagenes Bit A Bit
« en: Lunes 26 de Mayo de 2008, 23:18 »
0
Hola a todos, soy nuevo en estos foros y la verdad tengo poca experiencia programando en vbnet. La cuestion es que necesito unir dos imagenes en una sola, especificamente necesito incluir un logotipo(a colores) en otras imagenes y que el resultado se guarde como archivo de imagen (de preferencia en bmp).

He hecho una programa sencillo en vb6 que utiliza las funciones getpixel y pset, pero funciona muy lento (se demora 2 minutos en visualizar el resultado), luego lo pasé a vbnet 2005, allí utilizo getpixell y setpixell, pero demora aún mas (como 5 minutos).  Consultando en  diversas páginas me he encontrado con la funcion lockbit y unlockbit, y me han sugerido que en lugar de usar pixeles haga la comparación bit a bit, pero estoy perdido en este tema.

Por favor si alguien conoce el uso de estas funciones (u otras que hagan lo mismo) y me puede mandar un código sencillo de muestra (en vbnet ) me harían un tremendo favor. Agradezco de antemano si alguien me puede ayudar en este tema. Mi correo es javi_66@yahoo.com.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Unir Dos Imagenes Bit A Bit
« Respuesta #1 en: Martes 27 de Mayo de 2008, 11:41 »
0
No se hacen tareas, ni se envían trabajos al correo de nadie. En cuanto al uso de funciones está disponible la MSDN en español en la página de Microsoft.

Luego no especificas si lo que quieres es fundir 2 imágenes en 1 sola o si lo que quieres es añadir una segunda imagen al final (o encima) de la primera.

Si es lo 2º lo puedes hacer en un 'periquete', tanto en vb6 cono en vb2005: De entrada coloca tu 'logo' en un picturebox, y la imagen primaria en otro picturebox, ahora con el método bitblt o paintpicture (en vb6) copias el contenido del pictureboxLogo al pictureBoxDestino en las coordenadas que quieras, conlas medidas que quieras. Esto no demora ni 5 minutos ni 2 minutos, es instantáneo salvo que las imágenes tengan cientos de Mb. , que imagino que no es el caso.

Lo acorde es que el logo tenga transparencia para no generar imágenes demasiado intrusivas, entonces si usas VB6 esto deberías hacerlo usando una imagen GIF por ejemplo.

Si quieres trabajar a nivel de bit, debes usar las APIs para tener un tiempo de respuesta aceptable, procesarlo en memoria y sólo cuando esté el resultado final listo volcarlo a un control de imagen o a fichero. Después podrás importar el proyecto a vb2005 y ver la lista y consejos de conversión que te ofrece , para futuras referencias o para inentar mejorarlo. Personalmente trabajando con imágenes me siento más cómodo con VB6, siento que es más rápido...aunque no he explorado todo el potencial de vb2005 en cuanto a imagen se refiere...
«Ma non troppo»
----> ModoVacaciones = False<----

javi_66

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Unir Dos Imagenes Bit A Bit
« Respuesta #2 en: Martes 27 de Mayo de 2008, 15:09 »
0
Gracias por tu consejo, me disculpo si no conocia las reglas del foro, pero la verdad estoy desesperado.

La idea es que tengo que sacar fotos con un logo que tiene que tener partes transparentes (y poder imprimirla en una impresora de fotos). Cuando utilizo paintpicture el logo sobrepuesto sobre la foto es un cuadrado que tiene fondo blanco y no fondo transparente como se requiere, eso a pesar de que la imagen original es de tipo gif.

No conozco el método bitblt y si me pudieras dar alguna referencia sobre este te lo agradecería

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Unir Dos Imagenes Bit A Bit
« Respuesta #3 en: Miércoles 28 de Mayo de 2008, 14:59 »
0
BitBlt es una API, muy similar al funcionamiento del paintpicture... pero es ligeramente más rápido...

Código: Text
  1.  
  2. Private Declare Function BitBlt Lib &#34;gdi32&#34; (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  3.  
  4.  

'dwRop' es una constante de vb6 de las que hay en 'RasterOpConstants' típicamente se usa vbSrcCopy, que es la que equivale a 'copiar lo que se ve en origen tal como se ve'.

ejemplo de uso:
Código: Text
  1.  
  2. Dim ret As Integer
  3. ' sea frm el formulario, (el destino de la imagen, un objeto que tiene propiedad HDC) , x e y son las coordenadas de destino, dx y dy son las dimensiones de destino, pic es un picturebox, 0 y 0 son las coordenadas de origen donde copiamos, si se omiten el siguiente par de parámetros se entiende que se toma ancho y alto de origen como esos valores.
  4.  
  5. ret = BitBlt(frm.hDC, x, y, dx, dy, Pic.hDC, 0, 0, vbSrcCopy)
  6.  
  7.  
Modificando los parámetros por valores negativos convenientemente se consigue una copia invertida verticalmente, etc..

El logo debe estar en un picturebox al que se le ha aplicado transparencia, o bien en un formulario con transparencia usa la aPI siguiente:
Código: Text
  1.  
  2. Private Declare Function SetLayeredWindowAttributes Lib &#34;user32.dll&#34; (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
  3.  
  4.  
busca ejemplos del uso de la API en el foro si no se encuentran busca en google...
«Ma non troppo»
----> ModoVacaciones = False<----