Autor Tema: leer imagen desde un res  (Leído 11192 veces)

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

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
leer imagen desde un res
« en: Marzo 20, 2014, 03:36:05 pm »
buenas que tal disulpe las molestias pero existen algun codigo que este acoplado a un usercontrol
que permita pintar una imagen desde un archivo res...

estado haciendo pruebas con algunos controles como el ucImage y el ClsImageControls que tienen para
leer y pintar imagenes desde un res. pero no me sale

tengo errores tambien de estas dos apis...
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)

y

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

el primero uso para esto
Private Function pvAlphaBlend(ByVal clrFirst As Long, ByVal clrSecond As Long, ByVal lAlpha As Long) As Long
 
    Dim clrFore             As UcsRgbQuad
    Dim clrBack             As UcsRgbQuad
 
    OleTranslateColor clrFirst, 0, VarPtr(clrFore)
    OleTranslateColor clrSecond, 0, VarPtr(clrBack)
    With clrFore
        .R = (.R * lAlpha + clrBack.R * (255 - lAlpha)) / 255
        .G = (.G * lAlpha + clrBack.G * (255 - lAlpha)) / 255
        .b = (.b * lAlpha + clrBack.b * (255 - lAlpha)) / 255
    End With
    CopyMemory VarPtr(pvAlphaBlend), VarPtr(clrFore), 4
 
End Function



y la otra funcion la saque del proyecto de ucimage

me dice que hay conflicto

pero lo que mas me interesa saber es si existe algun modulo que pueda leer desde un res pero dentro de un usercontrol
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #1 en: Marzo 21, 2014, 12:45:44 am »
Hola K_arlytos, podes resolverlo de dos formas, o renombras la api (Preferentemente la de la funcion pvAlphaBlend) con otro nombre por ejemplo :

Código: [Seleccionar]
Private Declare Sub CopyMemorylng Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
y luego la cambias dentro de la funcion

o bien usas la misma para ambos casos, donde te sugiero que elimines la que tiene los parametros "Long", osea la de la funcion pvAlphaBlend, entonces esa función quedaría así

Código: (Vb) [Seleccionar]
' Función para trasladar un color a otro en porcentaje lAlpha(0 A 255)
Private Function pvAlphaBlend(ByVal clrFirst As Long, ByVal clrSecond As Long, ByVal lAlpha As Long) As Long
 
    Dim clrFore         As UcsRgbQuad
    Dim clrBack         As UcsRgbQuad
 
    OleTranslateColor clrFirst, 0, VarPtr(clrFore)
    OleTranslateColor clrSecond, 0, VarPtr(clrBack)
    With clrFore
        .R = (.R * lAlpha + clrBack.R * (255 - lAlpha)) / 255
        .G = (.G * lAlpha + clrBack.G * (255 - lAlpha)) / 255
        .B = (.B * lAlpha + clrBack.B * (255 - lAlpha)) / 255
    End With
 
    CopyMemory pvAlphaBlend, clrFore, 4
 
End Function


PD: no entiendo bien en sí, cual es la duda con el titulo del post, tengo entendido que el ucImage le desde Res, cual es el problema, o pon algo de código haber si estas haciendo algo mal.

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #2 en: Marzo 21, 2014, 01:47:50 am »
bueno sobre el problema del copymemory era un problema que no podia resolverlo.. espero que a otras personas les ayude tambien

lo que tengo en mente es  poder leer una imagen desde un *.res pero desde mi usercontrol y poder pintarlo en un area o
 coordenas que yo establesca
tengo como referencia el ClsImageControls "pero segun recuerdo eso lo usabas en los botones y se tenia que compilar primero para que se vea el efecto..." lo que yo deseo es que se visualice sin tener que compilarlo

algo parecido a este metodo, pero este metodo lo lee desde un archivo... y lo que deseo es que se lea desde el archivo *.res
http://leandroascierto.com/foro/index.php?topic=2481.0

solo copie y pegue el codigo del modulo "ClsImageControls" para probar pero no me pinta nada
 
http://www.mediafire.com/download/e5n1rden3r9uqz1/leerRes.rar
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #3 en: Marzo 21, 2014, 01:06:36 pm »
Estimado k_arlytos
 
Ya has intentado usar LoadResPicture esto te retorna un objeto del tipo stdPicture

Por ejemplo:
  Command1.Picture = LoadResPicture(101, vbResIcon)
 
Saludos, desde algún lugar de Lima - Perú
 
Saludos, desde algún lugar de Lima-Perú

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #4 en: Marzo 21, 2014, 02:18:36 pm »
quisiera trabajarlo con tipo de dato Long, para trabajarlo con apis
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #5 en: Marzo 24, 2014, 01:12:17 am »
espero alguien pueda ayudar.. aun no encuentro la solucion :(
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #6 en: Marzo 24, 2014, 04:08:43 am »
Estimado k_arlytos
 
Por un lado, indicas que quieres pintar una imagen que está en tu archivo .res en tu user control. Y por otro lado, dices que quieres trabajar con datos tipo Long.
 
Cuando dices que quieres sacar la imagen de un archivo .res te estás refiriendo a un archivo externo a al binario compilado en VB6. Por qué el .res al momento de compilar se incluye dentro del binario resultante. Por favor, puedes aclarar que es lo que realmente necesitas. Gracias.
 
Saludos, desde algún lugar de Lima - Perú

 
Saludos, desde algún lugar de Lima-Perú

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #7 en: Marzo 24, 2014, 11:07:09 pm »
como dice Albertomi, vos tenes un .res al momento de "edicion" (osea desde el IDE de vb). ahora, cuando compilas (.exe), no tendria porque estar el .res ahi, sino que ha quedado embeido en la seccion de recursos.

vos queres usar las apis que leen desde recursos, y ver como queda desde "edicion" sin tener que compilar?
o SIEMPRE queres usar un .res y leer recursos desde ahi (inclusive compilado) ?
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #8 en: Marzo 25, 2014, 03:22:19 am »
lo unico que deseo nada mas es leer una imagen desde un archivo *.res para poder pintarlo en mi usercontrol.. esa imagen es algo como un "imagen cerrar", es algo que siempre se debe de pintar por eso lo quiero sacar desde un *.res, eh revisado algunos archivos como el ucImage

tengo entendido que la funcion LoadResPicture(101, vbResIcon) te retorna un objeto stdPicture
pero al tener como resultado un stdPicture como lo puedo pintar en una seccion de mi user control?

en este ejemplo la imagen se sacan desde un archivo...
http://leandroascierto.com/foro/index.php?topic=2481.0

creo que con esta API es posible pintarlo pero lo que veo es que no usa ningun parametro de stdPicture
GdipDrawImageRectRectI hGraphics, hImg, DestX, DestY, DestW, DestH, x, y, Width, Height, &H2, 0&, 0&, 0&

el ucImage no usa stdPicture para pintar la imagen obtenida de un *.res y este tampoco
http://www.mediafire.com/download/e5n1rden3r9uqz1/leerRes.rar
lo saque de la clase ClsImageControls de leandro




"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #9 en: Marzo 25, 2014, 03:31:29 am »
Ninguno de esos codigos saca una imagen de un .res, mas bien de los recursos del exe compilado. El .res es necesario solo en tiempo de edicion.
Ahora bien, esos codigos usan GDI+, el cual maneja a los graficos como punteros (hGraphics), los cuales deben ser inicializados con imagrnes DC, bit stream (un archivo, los datos binarios de un recurso), o desde otros objetos. Hay apis que convierten stdpicture en hGraphics.

Pero, vos podes cargar la imagen desde recursos como un stdpicture y pintarla con los metodos PaintPicture del UC (pasarle como imagen lo q leiste del recurso)
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

cristian_19a

  • Kilobyte
  • **
  • Mensajes: 80
  • Reputación: +28/-3
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #10 en: Marzo 25, 2014, 11:54:01 am »

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #11 en: Marzo 25, 2014, 01:46:33 pm »
pero yo quiero que el *.res este en mi proyecto en modo de diseño para poder obtener la imagen  cuando se ejecute
asi este o no el *.res en mi sistema
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #12 en: Marzo 26, 2014, 12:21:21 am »
Hola, vos queres leer una imagen png desde el archivo de recurso de tu proyecto y dibujarla, bien lo que tenes que hacer es poner una imagen PNG y para que sea organizado guardala dentro de un tipo "CUSTOM", y el nombre que vos quieras. me explico no la guardes como un bitmap esto es para que la puedas leer con LoadResData de vb, ahora bien esto te devuelve un array de bits, despues fijate el codigo de abajo como funciona, tambien te incluyo un link de descarga para que veas como esta nombrada la imagen dentro del archivo de recurso.

Código: (VB) [Seleccionar]
Option Explicit
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByRef hGlobal As Any, ByVal fDeleteOnRelease As Long, ByRef ppstm As Any)
Private Declare Function GdipLoadImageFromStream Lib "gdiplus" (ByVal Stream As Any, ByRef image As Long) As Long
Private Declare Function GdiplusStartup Lib "gdiplus" (Token As Long, inputbuf As GDIPlusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal Token As Long)
Private Declare Function GdipDrawImageRect Lib "GdiPlus.dll" (ByVal mGraphics As Long, ByVal mImage As Long, ByVal mX As Single, ByVal mY As Single, ByVal mWidth As Single, ByVal mHeight As Single) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "GdiPlus.dll" (ByVal mGraphics As Long) As Long
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, ByRef graphics As Long) As Long
Private Declare Function GdipGetImageDimension Lib "GdiPlus.dll" (ByVal mImage As Long, ByRef mWidth As Single, ByRef mHeight As Single) As Long

Private Type GDIPlusStartupInput
    GdiPlusVersion           As Long
    DebugEventCallback       As Long
    SuppressBackgroundThread As Long
    SuppressExternalCodecs   As Long
End Type

Private Function LoadImageFromStream(ByRef bvData() As Byte, ByRef hImage As Long) As Boolean

    On Local Error GoTo LoadImageFromStream_Error
   
    Dim IStream     As IUnknown
   
    If Not IsArrayDim(VarPtrArray(bvData)) Then Exit Function
   
    Call CreateStreamOnHGlobal(bvData(0), 0&, IStream)
   
    If Not IStream Is Nothing Then
       
        If GdipLoadImageFromStream(IStream, hImage) = 0 Then
           
            LoadImageFromStream = True

        End If
           
    End If

    Set IStream = Nothing
   
LoadImageFromStream_Error:

End Function

Private Function IsArrayDim(ByVal lpArray As Long) As Boolean
    Dim lAddress As Long
    Call CopyMemory(lAddress, ByVal lpArray, &H4)
    IsArrayDim = Not (lAddress = 0)
End Function

Private Sub Form_Load()
    Dim gdiSI As GDIPlusStartupInput
    Dim gToken As Long
    Dim ArrImagen() As Byte
    Dim hImage As Long
    Dim hGraphics As Long
    Dim mWidth As Single, mHeigth As Single
   
    Me.AutoRedraw = True
   
    gdiSI.GdiPlusVersion = &H1
    GdiplusStartup gToken, gdiSI   'Inicializa GDI Plus, El puntero es "gToken"
   
    If gToken Then
        ArrImagen = LoadResData("IMAGEN", "CUSTOM")   'Lee una imagen desde el archivo de Recurso con LoadResData este devuelve un Array de bits
       
        If LoadImageFromStream(ArrImagen, hImage) Then  'GDI Plus lee la imagen desde el array de bits y el puntero de la imagen es "hImagen"
       
            If GdipCreateFromHDC(Me.hdc, hGraphics) = 0 Then 'Crea un Grafico a partir de un HDC "hGraphics" es el puntero
           
               
                GdipGetImageDimension hImage, mWidth, mHeigth  'Obtiene las dimenciones de la imagen
               
                GdipDrawImageRect hGraphics, hImage, 0, 0, mWidth, mHeigth  'Pinta la imagen sobre el Grafico, el cual veremos en nuestro formulario
           
                GdipDeleteGraphics hGraphics 'Elimina el Grafico
            End If
           
           
            GdipDisposeImage hImage 'Descarga la imagen
       
        End If
       
       
        GdiplusShutdown gToken  'Detiene GDI Plus
    End If

    Me.Refresh  'Refresco el formulario.
 
End Sub

Esta todo bien comentado por lo que no  vas a tener problemas para adaptarlo a como vos quieras usarlo.

Descargar..
http://www.mediafire.com/download/z728ikndz5z525u/Karlitos.zip

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #13 en: Marzo 26, 2014, 01:19:44 am »
Muchisimas gracias leandro de ley que esto les va a servir a los que estan metido en esto...
voy a estudiarlo...
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #14 en: Marzo 26, 2014, 01:39:30 pm »
y si esa imagen estuviese pintado en una esquina como podria hacer para que alguien le pueda dar click a esa imagen pintada y me muestre un msgbox?

puesto que eso no es un control con eventos si no que es una imagen pintada
no tengo idea de como hacerlo....

de antemano muchas gracias...
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"