Autor Tema: Convertir array de bytes a String y viceversa  (Leído 22105 veces)

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

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Convertir array de bytes a String y viceversa
« en: Mayo 28, 2011, 05:59:58 pm »
Hola, les explico bien cual es el problema.

estoy usando el control llamado ucImage de Cobein que tambien puede ser descargado de la pagina de Leandro.

bien, el tema es este, yo quiero convertir el Stream de la imagen cargada en el control a String...o sea seria lo mismo que abrir con el bloc de notas una imagen (por ejemplo .png) y ver su binario, que luce algo como esto:

‰PNG

   
IHDR   }   }   €l%      pHYs    d_‘    cHRM  z%  €ƒ  ùÿ  €é  u0  ê`  :˜  o’_ÅF  IDATxÚìy|åÇ3{e¯’ÍB œr
õ@"T å¹¼ÚzP©+´{P X¨~µ-*Z J‘›ÜŒ   dCBŽ=²×ÌÛ?v†L–d“=f7™Ïg>»™ìÎÎÌwžßû¼Ïó¼ïP„ô.=k¡{/AÏ[¤žÞ!EQb97
@•±ö<˜,âV€D°Ò ¨Æmw>ÔkãÁ‡-   ½Êk·Œ|^Rsê cæè·z‘”§9?È»+p9 ·-Û<d©Î|áõŽþšú‰Â{²¼:t!ð * jî½4륁‹Ó?<{Ó—bÆlV¯Ê^Ó =ð +h „ ùòWÉóî([J9?çrA@¨ØÑ[5«rŸéuä³
çß @üûË—ÞQ¶¬-àΪsŸ6mñZ¯#ØÀ£Ľ»,qáœÄòG;e
5ëšßNíqàMÞÛ»sYâü™}ˤÝ8*fäVͪü ’ú`‘÷vo[?kv’{À¹R¨Îʰ}Äë½ò@À3%Î^œrõÝ(}ÁZSfÏhãAÞÛþáòÄ'–Oñ˜DÚ¢z"ï—½ò.R ߺ0q¦' S÷´)35¨¥žXà g.I)Ÿáñ¥@‘ꜵ† îΉUÞÛ—ô•}>e²×¯Nôè-š'rRêMÞÛ¾}qÂ,Ÿ @ô¹Ov¤nî•wvËÄÏ\Ô¿â><ŠªÊYmÚ>rS¯¼{GÞÛþ~zâcsú–ÿÌo*vÌ[êŒìç{åÝGþö’„9³ý

hasta ahi bien, uso la propiedad del control llamada .GetStream que me devuelve unn array de bytes del stream de la imagen, lo convierto a string usando una funcion, ya probe con CopyMemory y fue la que mejor resultado me dio, pero les digo porqee no funciona.

cuando imprimo en el Debug el string que me convirtio, me sale todo bien, salvo que en algunos puntos me hace como un "salto de linea" y claro...ahi ya se deforma todo el codigo de la imagen y despues cuando la convierto a Bytes y se la paso a la propiedad LoadImageFromStream no me la carga....

AVISO IMPORTANTE, este foro me hace lo mismo que cuando yo la convierto a string, o sea me reemplaza los caracteres de los "cuadraditos" a saltos de linea...pero en realidad no debe ser asi, debe quedar todo el string en una linea...algo asi...

‰PNG
IHDR   }   }   €l%      pHYs    d_‘    cHRM  z%  €ƒ  ùÿ  €é  u0  ê`  :˜  o’_ÅF  IDATxÚìy|åÇ3{e¯’ÍB œr
õ@"T å¹¼ÚzP©+´{P X¨~µ-*Z J‘›ÜŒ   dCBŽ=²×ÌÛ?v†L–d“=f7™Ïg>»™ìÎÎÌwžßû¼Ïó¼ïP„ô.=k¡{/AÏ[¤žÞ!EQb97@•±ö<˜,âV€D°Ò ¨Æmw>ÔkãÁ‡-   ½Êk·Œ|^Rsê cæè·z‘”§9?È»+p9 ·-Û<d©Î|áõŽþšú‰Â{²¼:t!ð * jî½4륁‹Ó?<{Ó—bÆlV¯Ê^Ó =ð +h „ ùòWÉóî([J9?çrA@¨ØÑ[5«rŸéuä³
çß @üûË—ÞQ¶¬-àΪsŸ6mñZ¯#ØÀ£Ľ»,qáœÄòG;e5ëšßNíqàMÞÛ»sYâü™}ˤÝ8*fäVͪü ’ú`‘÷vo[?kv’{À¹R¨Îʰ}Äë½ò@À3%Î^œrõÝ(}ÁZSfÏhãAÞÛþáòÄ'–Oñ˜DÚ¢z"ï—½ò.R ߺ0q¦' S÷´)35¨¥žXà g.I)Ÿáñ¥@‘ꜵ† îΉUÞÛ—ô•}>e²×¯Nôè-š'rRêMÞÛ¾}qÂ,Ÿ @ô¹Ov¤nî•wvËÄÏ\Ô¿â><ŠªÊYmÚ>rS¯¼{GÞÛþ~zâcsú–ÿÌo*vÌ[êŒìç{åÝGþö’„9³ý

me entendieron, en resumen..quier guardar en algun lado el stream de la imagen, para despues recuperarlo y crear la imagen a partir de ese stream guardado.

saludos.
« última modificación: Mayo 28, 2011, 06:11:18 pm por seba123neo »

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Convertir array de bytes a String y viceversa
« Respuesta #1 en: Mayo 28, 2011, 07:49:58 pm »
creo que encontre la solucion...encontre un modulo en internet que pasa un array de bytes a string base64..o sea:

Código: [Seleccionar]
gWriYpx/pUj/eWGNuzl993ntePXHmw4NJ0sUEvTvgzYXrinObPZydIwRM/SdNwnx4UAEXg7x3W+q1MRrViDc949UThtiadhmXnt2bnxPowANldinh4EQ+JduhxRuqjeb831zI6W4+nhDCNnxoSg8G4IEg77fqztk6C96o5/LxXUzSEJaQhj2GgMmHByN00knwrfrxDVeajAVrLuQ0V7uXpCEMsRk+Mi3K3lVwsicAF1ubfqt23v0kzeYhqcqojtt4woJpes+w8Oy+wEuPBkub3pHUdzpJc35D50qvGj42rghG4IHaprvTnatqQ+pN5zYUZ98qH09YYmvcY17sUrXaI4AHgry3JfUdJWnCOamXaOM0slFvDr1LoZNr+Z0ESj7cm/IeaNA704+PhHPosgwAE9Evgox4c+BDsjBZBAA07DEtDYb0aE+B3hnwMXCOkA3nnD87AEPM6CjH4A3J6cYvbRuy3g+u5ElPgN4R+Kg2oDcBuBYSFnLd0mip7CltuFinCe2Oc0cJnDtXT9/Kgb5h6QCuWxot13ui0xYs0NsDz//dyEF3oGUqUf7ZrT0aOAD8fwDBU9K1
oXb0pwAAAABJRU5ErkJggg==

despues me deja convertir esa cadena en un array de bytes nuevamente y se lo paso a la propiedad .LoadImageFromStream y funciona perfecto...

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #2 en: Mayo 28, 2011, 10:41:11 pm »
Creo que me perdi... lo que haces aqui es convertir una foto a string para guardar el string en la BD y luego recuperar ese string para volver a tener la foto???? Si fuera asi pucha seria excelente.
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Convertir array de bytes a String y viceversa
« Respuesta #3 en: Mayo 28, 2011, 11:33:13 pm »
exacto, y como este control ya tiene el metodo GetStream y despues el .LoadImageFromStream, no hya que hacer nada, en una sola linea de codigo haces todo.

antes estaba usando ADOD.Stream para guardar el binario de la imagen en la base de datos de un picturebox, pero el tipo de dato image de sql server esta en desuso y es recomendable usar varchar(max) para guardar ahi el string.

ahora con este control todo se simplifica, aparte no importa el tipo de imagen, acepta cualquiera y hasta con transparencia alpha.

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #4 en: Mayo 29, 2011, 02:29:16 am »
Pues esta EXCELENTE!!!, podemos entonces grabar las imagenes interpretadas como string en la BD, esto esta fabuloso, voy a empezar a ver este tema mas profundamente.

Muchas gracias.
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #5 en: Mayo 29, 2011, 04:38:47 am »
Disculpa amigo sebas. estuve probando con el control que contiene una imagen e hice esto:

Dim m as string

m = BtnRegProd.GetStream

y en m tengo la cadena, pero leyendo mas arriba comentas que esa cadena no es la que debo guardar sino que  usando una función debo convertirla a un string base64. Allí me perdí, ¿como así lo convierto?, y entiendo que luego debo convertirla al revés, de base64 a array de bytes.

Gracias.
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Convertir array de bytes a String y viceversa
« Respuesta #6 en: Mayo 29, 2011, 09:05:05 am »
Hola es un modulo clase llamado Base64Class

Código: [Seleccionar]
Option Explicit

Private Const Equals As Byte = 61    'Asc("=")

Private Const Mask1 As Byte = 3      '00000011
Private Const Mask2 As Byte = 15     '00001111
Private Const Mask3 As Byte = 63     '00111111
Private Const Mask4 As Byte = 192    '11000000
Private Const Mask5 As Byte = 240    '11110000
Private Const Mask6 As Byte = 252    '11111100

Private Const Shift2 As Byte = 4
Private Const Shift4 As Byte = 16
Private Const Shift6 As Byte = 64

Private Base64Lookup() As Byte
Private Base64Reverse() As Byte

Public Function EncodeString(Text As String) As String

   Dim Data() As Byte
   
   Data = StrConv(Text, vbFromUnicode)
   EncodeString = EncodeByteArray(Data)

End Function

Public Function EncodeByteArray(Data() As Byte) As String

   Dim EncodedData() As Byte

   Dim DataLength As Long
   Dim EncodedLength As Long

   Dim Data0 As Long
   Dim Data1 As Long
   Dim Data2 As Long

   Dim l As Long
   Dim m As Long

   Dim Index As Long

   Dim CharCount As Long

   DataLength = UBound(Data) + 1

   EncodedLength = (DataLength \ 3) * 4
   If DataLength Mod 3 > 0 Then EncodedLength = EncodedLength + 4
   EncodedLength = EncodedLength + ((EncodedLength \ 76) * 2)
   If EncodedLength Mod 78 = 0 Then EncodedLength = EncodedLength - 2
   ReDim EncodedData(EncodedLength - 1)

   m = (DataLength) Mod 3

   For l = 0 To UBound(Data) - m Step 3
      Data0 = Data(l)
      Data1 = Data(l + 1)
      Data2 = Data(l + 2)
      EncodedData(Index) = Base64Lookup(Data0 \ Shift2)
      EncodedData(Index + 1) = Base64Lookup(((Data0 And Mask1) * Shift4) Or (Data1 \ Shift4))
      EncodedData(Index + 2) = Base64Lookup(((Data1 And Mask2) * Shift2) Or (Data2 \ Shift6))
      EncodedData(Index + 3) = Base64Lookup(Data2 And Mask3)
      Index = Index + 4
      CharCount = CharCount + 4

      If CharCount = 76 And Index < EncodedLength Then
         EncodedData(Index) = 13
         EncodedData(Index + 1) = 10
         CharCount = 0
         Index = Index + 2
      End If
   Next

   If m = 1 Then
      Data0 = Data(l)
      EncodedData(Index) = Base64Lookup((Data0 \ Shift2))
      EncodedData(Index + 1) = Base64Lookup((Data0 And Mask1) * Shift4)
      EncodedData(Index + 2) = Equals
      EncodedData(Index + 3) = Equals
      Index = Index + 4
   ElseIf m = 2 Then
      Data0 = Data(l)
      Data1 = Data(l + 1)
      EncodedData(Index) = Base64Lookup((Data0 \ Shift2))
      EncodedData(Index + 1) = Base64Lookup(((Data0 And Mask1) * Shift4) Or (Data1 \ Shift4))
      EncodedData(Index + 2) = Base64Lookup((Data1 And Mask2) * Shift2)
      EncodedData(Index + 3) = Equals
      Index = Index + 4
   End If

   EncodeByteArray = StrConv(EncodedData, vbUnicode)

End Function

Public Function DecodeToString(EncodedText As String) As String

   Dim Data() As Byte
   
   Data = DecodeToByteArray(EncodedText)
   DecodeToString = StrConv(Data, vbUnicode)

End Function

Public Function DecodeToByteArray(EncodedText As String) As Byte()

   Dim Data() As Byte
   Dim EncodedData() As Byte

   Dim DataLength As Long
   Dim EncodedLength As Long

   Dim EncodedData0 As Long
   Dim EncodedData1 As Long
   Dim EncodedData2 As Long
   Dim EncodedData3 As Long

   Dim l As Long
   Dim m As Long

   Dim Index As Long

   Dim CharCount As Long

   EncodedData = StrConv(Replace$(Replace$(EncodedText, vbCrLf, ""), "=", ""), vbFromUnicode)

   EncodedLength = UBound(EncodedData) + 1
   DataLength = (EncodedLength \ 4) * 3

   m = EncodedLength Mod 4
   If m = 2 Then
      DataLength = DataLength + 1
   ElseIf m = 3 Then
      DataLength = DataLength + 2
   End If

   ReDim Data(DataLength - 1)

   For l = 0 To UBound(EncodedData) - m Step 4
      EncodedData0 = Base64Reverse(EncodedData(l))
      EncodedData1 = Base64Reverse(EncodedData(l + 1))
      EncodedData2 = Base64Reverse(EncodedData(l + 2))
      EncodedData3 = Base64Reverse(EncodedData(l + 3))
      Data(Index) = (EncodedData0 * Shift2) Or (EncodedData1 \ Shift4)
      Data(Index + 1) = ((EncodedData1 And Mask2) * Shift4) Or (EncodedData2 \ Shift2)
      Data(Index + 2) = ((EncodedData2 And Mask1) * Shift6) Or EncodedData3
      Index = Index + 3
   Next

   Select Case ((UBound(EncodedData) + 1) Mod 4)
   Case 2
      EncodedData0 = Base64Reverse(EncodedData(l))
      EncodedData1 = Base64Reverse(EncodedData(l + 1))
      Data(Index) = (EncodedData0 * Shift2) Or (EncodedData1 \ Shift4)
   Case 3
      EncodedData0 = Base64Reverse(EncodedData(l))
      EncodedData1 = Base64Reverse(EncodedData(l + 1))
      EncodedData2 = Base64Reverse(EncodedData(l + 2))
      Data(Index) = (EncodedData0 * Shift2) Or (EncodedData1 \ Shift4)
      Data(Index + 1) = ((EncodedData1 And Mask2) * Shift4) Or (EncodedData2 \ Shift2)
   End Select

   DecodeToByteArray = Data

End Function

Private Sub Class_Initialize()

   Dim l As Long
   
   ReDim Base64Reverse(255)
   
   Base64Lookup = StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", vbFromUnicode)
   
   For l = 0 To 63
      Base64Reverse(Base64Lookup(l)) = l
   Next
   
End Sub

Saludos.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Convertir array de bytes a String y viceversa
« Respuesta #7 en: Mayo 29, 2011, 01:00:10 pm »
buenisimo Leandro, el modulo de clase es casi igual que el que encontre en internet, por las dudas lo posteo aca haber si alguien tambien le sirve:

Código: [Seleccionar]
Option Explicit
 
Private InitDone  As Boolean
Private Map1(0 To 63)  As Byte
Private Map2(0 To 127) As Byte
 
' Encodes a string into Base64 format.
' No blanks or line breaks are inserted.
' Parameters:
'   S         a String to be encoded.
' Returns:    a String with the Base64 encoded data.
Public Function Base64EncodeString(ByVal s As String) As String
 Base64EncodeString = Base64Encode(ConvertStringToBytes(s))
 End Function
 
' Encodes a byte array into Base64 format.
' No blanks or line breaks are inserted.
' Parameters:
'   InData    an array containing the data bytes to be encoded.
' Returns:    a string with the Base64 encoded data.
Public Function Base64Encode(InData() As Byte)
 Base64Encode = Base64Encode2(InData, UBound(InData) - LBound(InData) + 1)
 End Function
 
' Encodes a byte array into Base64 format.
' No blanks or line breaks are inserted.
' Parameters:
'   InData    an array containing the data bytes to be encoded.
'   InLen     number of bytes to process in InData.
' Returns:    a string with the Base64 encoded data.
Public Function Base64Encode2(InData() As Byte, ByVal InLen As Long) As String
 If Not InitDone Then Init
 If InLen = 0 Then Base64Encode2 = "": Exit Function
 Dim ODataLen As Long: ODataLen = (InLen * 4 + 2) \ 3     ' output length without padding
 Dim OLen As Long: OLen = ((InLen + 2) \ 3) * 4           ' output length including padding
 Dim Out() As Byte
 ReDim Out(0 To OLen - 1) As Byte
 Dim ip0 As Long: ip0 = LBound(InData)
 Dim ip As Long
 Dim op As Long
 Do While ip < InLen
 Dim i0 As Byte: i0 = InData(ip0 + ip): ip = ip + 1
 Dim i1 As Byte: If ip < InLen Then i1 = InData(ip0 + ip): ip = ip + 1 Else i1 = 0
 Dim i2 As Byte: If ip < InLen Then i2 = InData(ip0 + ip): ip = ip + 1 Else i2 = 0
 Dim o0 As Byte: o0 = i0 \ 4
 Dim o1 As Byte: o1 = ((i0 And 3) * &H10) Or (i1 \ &H10)
 Dim o2 As Byte: o2 = ((i1 And &HF) * 4) Or (i2 \ &H40)
 Dim o3 As Byte: o3 = i2 And &H3F
 Out(op) = Map1(o0): op = op + 1
 Out(op) = Map1(o1): op = op + 1
 Out(op) = IIf(op < ODataLen, Map1(o2), Asc("=")): op = op + 1
 Out(op) = IIf(op < ODataLen, Map1(o3), Asc("=")): op = op + 1
 Loop
 Base64Encode2 = ConvertBytesToString(Out)
 End Function
 
' Decodes a string from Base64 format.
' Parameters:
'    s        a Base64 String to be decoded.
' Returns     a String containing the decoded data.
Public Function Base64DecodeString(ByVal s As String) As String
 If s = "" Then Base64DecodeString = "": Exit Function
 Base64DecodeString = ConvertBytesToString(Base64Decode(s))
 End Function
 
' Decodes a byte array from Base64 format.
' Parameters
'   s         a Base64 String to be decoded.
' Returns:    an array containing the decoded data bytes.
Public Function Base64Decode(ByVal s As String) As Byte()
 If Not InitDone Then Init
 Dim IBuf() As Byte: IBuf = ConvertStringToBytes(s)
 Dim ILen As Long: ILen = UBound(IBuf) + 1
 If ILen Mod 4 <> 0 Then Err.Raise vbObjectError, , "Length of Base64 encoded input string is not a multiple of 4."
 Do While ILen > 0
 If IBuf(ILen - 1) <> Asc("=") Then Exit Do
 ILen = ILen - 1
 Loop
 Dim OLen As Long: OLen = (ILen * 3) \ 4
 Dim Out() As Byte
 ReDim Out(0 To OLen - 1) As Byte
 Dim ip As Long
 Dim op As Long
 Do While ip < ILen
 Dim i0 As Byte: i0 = IBuf(ip): ip = ip + 1
 Dim i1 As Byte: i1 = IBuf(ip): ip = ip + 1
 Dim i2 As Byte: If ip < ILen Then i2 = IBuf(ip): ip = ip + 1 Else i2 = Asc("A")
 Dim i3 As Byte: If ip < ILen Then i3 = IBuf(ip): ip = ip + 1 Else i3 = Asc("A")
 If i0 > 127 Or i1 > 127 Or i2 > 127 Or i3 > 127 Then _
 Err.Raise vbObjectError, , "Illegal character in Base64 encoded data."
 Dim b0 As Byte: b0 = Map2(i0)
 Dim b1 As Byte: b1 = Map2(i1)
 Dim b2 As Byte: b2 = Map2(i2)
 Dim b3 As Byte: b3 = Map2(i3)
 If b0 > 63 Or b1 > 63 Or b2 > 63 Or b3 > 63 Then _
 Err.Raise vbObjectError, , "Illegal character in Base64 encoded data."
 Dim o0 As Byte: o0 = (b0 * 4) Or (b1 \ &H10)
 Dim o1 As Byte: o1 = ((b1 And &HF) * &H10) Or (b2 \ 4)
 Dim o2 As Byte: o2 = ((b2 And 3) * &H40) Or b3
 Out(op) = o0: op = op + 1
 If op < OLen Then Out(op) = o1: op = op + 1
 If op < OLen Then Out(op) = o2: op = op + 1
 Loop
 Base64Decode = Out
 End Function
 
Private Sub Init()
 Dim c As Integer, i As Integer
 ' set Map1
 i = 0
 For c = Asc("A") To Asc("Z"): Map1(i) = c: i = i + 1: Next
 For c = Asc("a") To Asc("z"): Map1(i) = c: i = i + 1: Next
 For c = Asc("0") To Asc("9"): Map1(i) = c: i = i + 1: Next
 Map1(i) = Asc("+"): i = i + 1
 Map1(i) = Asc("/"): i = i + 1
 ' set Map2
 For i = 0 To 127: Map2(i) = 255: Next
 For i = 0 To 63: Map2(Map1(i)) = i: Next
 InitDone = True
 End Sub
 
Private Function ConvertStringToBytes(ByVal s As String) As Byte()
 Dim b1() As Byte: b1 = s
 Dim l As Long: l = (UBound(b1) + 1) \ 2
 If l = 0 Then ConvertStringToBytes = b1: Exit Function
 Dim b2() As Byte
 ReDim b2(0 To l - 1) As Byte
 Dim p As Long
 For p = 0 To l - 1
 Dim c As Long: c = b1(2 * p) + 256 * CLng(b1(2 * p + 1))
 If c >= 256 Then c = Asc("?")
 b2(p) = c
 Next
 ConvertStringToBytes = b2
 End Function
 
Private Function ConvertBytesToString(b() As Byte) As String
 Dim l As Long: l = UBound(b) - LBound(b) + 1
 Dim b2() As Byte
 ReDim b2(0 To (2 * l) - 1) As Byte
 Dim p0 As Long: p0 = LBound(b)
 Dim p As Long
 For p = 0 To l - 1: b2(2 * p) = b(p0 + p): Next
 Dim s As String: s = b2
 ConvertBytesToString = s
 End Function

fijate que no esta muy prolijo el codigo...pero funciona, creo que voy a usar el tuyo Leandro, lo pruebo y te aviso.

bueno ahora explico como es el tema:

@ YvanB

la propiedad .GetStream devuelve un array de bytes, ese array lo debes pasar a base64 con el modulo mio o de Leandro.

te lo pongo como seria con el modulo mio, el ejemplo es sin base de datos, eso despues lo haces vos.

Código: [Seleccionar]
Private Sub Form_Load()
Dim i As Class1
Set i = New Class1

Debug.Print i.Base64Encode(ucImage1.GetStream)

Set i = Nothing
End Sub

y listo, con eso te imprime el string en base64 de la imagen y ahi guardas ese string en la base.

para hacer lo contrario, o sea el Decode, seria asi:

Código: [Seleccionar]
Dim i As Class1
Set i = New Class1

Dim vStringImagen As String
vStringImagen = "iVBORw0KGgoAAAANSUhEUgAAAH0AAAB9CAYAAoXb0pwAAAABJRU5ErkJggg=="

ucImage1.LoadImageFromStream i.Base64Decode(vStringImagen)
Set i = Nothing

la variable vStringImagen contiene el string que guardamos antes...y listo, con eso el control nos muestra la imagen tal cual la guardamos.

y aviso que el formato de la imagen no importa, acepta todos los formatos de imagen que el ucImage soporte...en cambio antes con un picturebox y el ADODB.Stream estaba obligado a jpg,bmp y nada mas, o sea los formatos que acepta el picturebox, con este no.

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #8 en: Mayo 29, 2011, 04:00:03 pm »
Gracias Leandro por el modulo.
Sebas excelente, quedo claro, voy a aplicarlo ahora, muchas gracias por tu tiempo también.

Saludos
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #9 en: Mayo 30, 2011, 08:55:28 pm »
Mas tarde voy a empezar a jugar con este tema, pero estaba pensando... que tanto tarda la "conversion" de la foto? si la foto fuera mas grande!!! si fueran varias fotos!!! Lo han probado??

En todo caso ahora en la noche hare lo posible por ensayar todo esto y les cuento.

Saludos
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Convertir array de bytes a String y viceversa
« Respuesta #10 en: Mayo 30, 2011, 10:50:19 pm »
si, ya lo probe con el modulo de Leandro y va perfecto en la base de datos, es rapidisimo, yo limito al usuario a que la imagen sea menor a 50kb para no sobrecargar, pero con archivos mas grandes no creo que tenga problema.

saludos.

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Convertir array de bytes a String y viceversa
« Respuesta #11 en: Mayo 31, 2011, 11:42:11 am »
waooo, sorprendente esta esto...! Se optimiza los softwares para digitalización de documentos, pues todo se almacena en un nvarchar(max) en SQL y ya...! Realmente maravillado...! Me gustó..!
Miguel Núñez.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #12 en: Junio 26, 2011, 09:51:56 pm »
Disculpen la lentitud, estoy usando el de Leandro y la clase tiene:
EncodeString
EncodeByteArray
DecodeToString
DecodeToByteArray

Tengo el uc de Cobein ya con una foto cargada... entonces... debo convertir esa foto en string?
o debo convertirla en array primero y luego en string? Porque estoy probando y no me sale.

Dim i As Base64Class  '<--- esta mal??
Set i = New Base64Class

a = i.EncodeString(PicPartner.GetStream)

y veo a y tiene
"Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/"
unas 500 lineas de esas casi iguales... estara bien?? solo en algunos caracteres hay cambios pero basicamente
es lo mismo.

voy a intentar armar a partir del a la imagen a ver como anda.
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #13 en: Junio 26, 2011, 10:06:13 pm »
jeje funciono!!
En el botón que codifica puse esto (usando el de Lea)
aPic es string declarado a nivel superior
Código: [Seleccionar]
Dim i As Base64Class
Set i = New Base64Class
aPic = i.EncodeByteArray(PicPartner.GetStream)
Set i = Nothing
y en el boton que recupera hice esto:
Código: [Seleccionar]
Dim i As Base64Class
Set i = New Base64Class
Dim vStringImagen As String
ucImage2.LoadImageFromStream i.DecodeToByteArray(aPic)
Set i = Nothing

y me pinto la foto, uffff taba facil.

Entonces EncodeByteArray convierte A string el GetStream de la foto del uc
y el  DecodeToByteArray me convierte DEL string a ... byte?? no tengo claro eso.

Y no me queda claro en que casos usaria: EncodeString y DecodeToString

Bueno, por ahora lo que hare sera meter esa cadena aPic a mi base de datos

La verdad le agradecería mucho al que me pueda ubica un poco para ir entendiendo este tema.
Saludos
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Convertir array de bytes a String y viceversa
« Respuesta #14 en: Junio 26, 2011, 11:44:33 pm »
oohhh, creo que encontre una limitacion.
El string me genera una cadena de 33,216 caracteres. La foto original pesa 23.7 Kb. Y el campo Varchar solo me admite 32,767 caracteres. Creo que encontré una limitación en mi motor. Chess. Claro quiza lo pueda resolver partiendo la cadena en dos partes y meterlo en dos campos... pero como que ya se le pierde el "gusto". Fue lindo mientras duro.  :'(
Me encuentras en YAcosta.com