Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: seba123neo en Mayo 28, 2011, 05:59:58 pm

Título: Convertir array de bytes a String y viceversa
Publicado por: seba123neo 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo 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...
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: LeandroA 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: ssccaann43 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ó..!
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta 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.  :'(
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: raul338 en Junio 27, 2011, 11:37:38 am
Si usas mysql pon tipo BLOB o TEXT :D
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 27, 2011, 12:24:17 pm
No uso mysql, Firebird tambien tiene tipo Blob, voy a ver que usarlo alli.

Saludos
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo en Junio 28, 2011, 08:43:26 pm
yo lo uso en sql server que tiene el tipo de dato varchar(max) que no tiene limite, o si lo tiene son varios gigas. igualmente yo no dejo seleccionar una imagen que se exceda de un tamaño particular, asi no satura la base de datos.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 28, 2011, 08:55:52 pm
yo lo uso en sql server que tiene el tipo de dato varchar(max) que no tiene limite, o si lo tiene son varios gigas. igualmente yo no dejo seleccionar una imagen que se exceda de un tamaño particular, asi no satura la base de datos.

Sebas, pero al margen de la BD, es correcta la forma en que convierto la imagen y la recupero?? y la cantidad de caracteres son los usuales? aun me queda duda por las otras dos funciones de Lea que no uso.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: raul338 en Junio 28, 2011, 09:10:56 pm
De ultima podes usar un resizeador de imagenes (con GDI por ejemplo)
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo en Junio 28, 2011, 09:57:53 pm
a mi tambien me dio la impresion de que devolvia mas bytes de los que eran, lo probe con una imagen chica hace muhcho y se notaba la diferencia, me imagino que con una grande se nota mas, ahora lo pruebo bien y te confirmo.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 28, 2011, 10:00:53 pm
Gracias Sebas, y disculpa la insistencia pero la verdad no capto bien EncodeString y DecodeToString, osea si ya tengo un string para que volver a usar el EncodeString y DecodeToString, eso no capto.

Gracias
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo en Junio 28, 2011, 10:37:37 pm
para pasarlo a array de bytes, que es lo que acepta el control ucImage, haber, trato de explicarlo  ;D.

la imagen que se guarda en el control ucImage es un array de bytes (el famoso Stream), por eso es necesario obtener ese array de bytes (con el .GetStream) y convertir ese array de bytes en String para poder guardarlo.

la conversion es lo contrario, agarras el string y con la clase lo volves a convertir a un array de bytes, y asi se lo pasas a la funcion .LoadImageFromStream, entonces el control ucImage interpreta ese array de bytes y muestra la imagen.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 28, 2011, 10:43:52 pm
Si amigo, y hago esa conversión con  EncodeByteArray y  DecodeToByteArray para convertirlo a string y recuperarlo, lo que no se es para que usaria EncodeString y DecodeToString de la clase de Leandro.

Muchas gracias

Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo en Junio 28, 2011, 10:54:24 pm
a perdon a, si esas 2 funciones son lo mismo, no se usan,  fijate que dentro de estas llaman a las mismas funciones que estamos usando, en realidad si queres la podes poner como privadas asi no las ves mas.

probe con una foto de camara digital, peso original de 2.1 megas, al convertirlo a string pesa casi 3 megas.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 28, 2011, 11:07:48 pm
Listo, entonces ya me queda claro, temía que quizá no estaba usando debidamente las conversiones.

Bueno, con lo que me explicas de la cámara, me confirma la siguiente duda ya a nivel conceptual. es una pregunta, dado que el tamaño del string no es significativa o medianamente corto, mmm, ¿cual es el beneficio de usarlo?.

He investigado y en FB también puedo grabar fotos, voy a seguir leyendo que problemas pudiera tener con el manejo de fotos dentro de mi motor si los hubiere, pero, mas alla de ser un código muy interesante e incluso sorprendente, ¿porque habría de usarlo? considerando que tengo un costo de tiempo en la conversión, no tanto para almacenarlo sino para leerlo, me interesaba usarlo en lista de productos donde muestre 20 a la vez por pantallazo y alli si quizá pueda sentir la demora.

La verdad me interesa usarlo, pero aun con la idea de Raul de rezisarlo tampoco veo un beneficio porque la foto en si la podría guardar resizada.

Entiéndase mis estimados que mi cuestionamiento es con todo respeto y sin un ápice de reclamo alguno (no tendria porque jeje) y la hago con todo el deseo de conocer y tener presente el beneficio, la ventaja o las desventajas.

Un abrazo y gracias por las respuestas.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: seba123neo en Junio 28, 2011, 11:15:27 pm
bueno la ventaja que le veo es que este control acepta lo que sea, digo acepta muhcisimos formatos de imagen, hasta png con transparencia alpha. en cambio con ADO Stream que era como guardaba antes, solo me limitaba a 2 formatos y aparte era horrible el codigo que habia que hacer para esto.

igual sigo investigando que puede ser, pero hasta ahora este metodo no lo cambio por nada.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 29, 2011, 12:12:42 am
Bueno es cierto, el control es power, el formato png ya de pòr si es una enorme ventaja tenerlo en un tipo de dato que no dará ningún conflicto... incluso si migrases la data de una BD a otra por el lado de fotos solo te llevas la cadena string. Por lo pronto habria que poner limitaciones claras.

Amigo Raul si me pudieses indicar donde encuentro ese resizeador de imagen te agradeceria, porque esta interesante ese pase previo antes de meterlo a la BD.

Saludos
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: LeandroA en Junio 30, 2011, 12:59:32 am
Hola Yvan, quizas si me da el tiempo pueda darte una mano, pero decime en que forma te valdria  la funcion

ResizeImage(ArrBitsEntrada, ArrBitsSalida, TamañoThumbnail)

ResizeImage(PathImagen, ArrBitsSalida, TamañoThumbnail)

ResizeImage(hImage, ArrBitsSalida, TamañoThumbnail)


La primera funcion pasas en el primer parametro el array de bits el cual ya leiste desde el archivo o base de datos, el segundo parametro es el array de bits de salida (el cual seria la imagen achicada), y el tercer parametro el tamaño de del Thumbnail

La segunda funcion pasas en el primer parametro el path de la imagen, el segundo parametro es el array de bits de salida (el cual seria la imagen achicada), y el tercer parametro el tamaño de del Thumbnail

La tercera funcion (la cual no creo que sea la uses) pasas en el primer parametro un hImage (GDI+ o podria ser un bitmap) , el segundo parametro es el array de bits de salida (el cual seria la imagen achicada), y el tercer parametro el tamaño de del Thumbnail

Saludos.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 30, 2011, 03:24:55 am
Mi estimado, gracias por la atención.

Quisiera preguntarte sobre la segunda función:

ResizeImage(PathImagen, ArrBitsSalida, TamañoThumbnail)

Pasar en primer parámetro el path de la imagen: Esto si esta claro, el usuario escogería la ruta de su archivo de foto, mi duda es que si también uso esta parte para mostrarla en el ucImage de Cobein.

El segundo parámetro es el array de bits de salida (el cual seria la imagen achicada): Aquí esta mi duda, no capto como es que seria de salida si son parámetros de entrada, no estoy entendiendo bien. Si es de salida entonces esa seria la cadena que meteria a la BD porque seria la foto achicada.

y el tercer parametro el tamaño de del Thumbnail Seria esta entonces la que mostraría en pantalla en vez de la del primer parámetro.

Bueno quizá lo comprenda cuando vea la función. Muchísimas gracias.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: cobein en Junio 30, 2011, 08:05:56 am
YAcosta, las estructuras/arrays se pasan como referencia (byref, simplemente un puntero al dato original, no el dato en si) osea que se pueden modificar y de esa manera utilizar como retorno.
Título: Re:Convertir array de bytes a String y viceversa
Publicado por: YAcosta en Junio 30, 2011, 12:17:52 pm
Diantres!!!... me falta mucho, voy a repasar ese tema porque lo desconocía asi, gracias por la aclaración.