Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado 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ͪü ’ú`‘÷vo[?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ͪü ’ú`‘÷vo[?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.
-
creo que encontre la solucion...encontre un modulo en internet que pasa un array de bytes a string base64..o sea:
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...
-
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.
-
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.
-
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.
-
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.
-
Hola es un modulo clase llamado Base64Class
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.
-
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:
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.
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:
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.
-
Gracias Leandro por el modulo.
Sebas excelente, quedo claro, voy a aplicarlo ahora, muchas gracias por tu tiempo también.
Saludos
-
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
-
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.
-
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ó..!
-
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.
-
jeje funciono!!
En el botón que codifica puse esto (usando el de Lea)
aPic es string declarado a nivel superior
Dim i As Base64Class
Set i = New Base64Class
aPic = i.EncodeByteArray(PicPartner.GetStream)
Set i = Nothing
y en el boton que recupera hice esto:
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
-
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. :'(
-
Si usas mysql pon tipo BLOB o TEXT :D
-
No uso mysql, Firebird tambien tiene tipo Blob, voy a ver que usarlo alli.
Saludos
-
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.
-
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.
-
De ultima podes usar un resizeador de imagenes (con GDI por ejemplo)
-
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.
-
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
-
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.
-
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
-
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.
-
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.
-
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.
-
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
-
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.
-
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.
-
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.
-
Diantres!!!... me falta mucho, voy a repasar ese tema porque lo desconocía asi, gracias por la aclaración.