2008-12-08 54 views
23

he descargar una imagen de Internet y convierte en una cadena (Esto no se puede cambiar)convertir una cadena a Stream

Dim Request As System.Net.WebRequest = _ 
    System.Net.WebRequest.Create(_ 
    "http://www.google.com/images/nav_logo.png") 

Dim WebResponse As System.Net.HttpWebResponse = _ 
    DirectCast(Request.GetResponse(), System.Net.HttpWebResponse) 

Dim Stream As New System.IO.StreamReader(_ 
    WebResponse.GetResponseStream, System.Text.Encoding.UTF8) 

Dim Text as String = Stream.ReadToEnd 

¿Cómo puedo convertir la cadena de nuevo a la corriente?

Entonces puedo usar esa corriente para obtener la imagen.

De esta manera:

Dim Image As New Drawing.Bitmap(WebResponse.GetResponseStream) 

Pero ahora sólo he la cadena de texto, así que necesito algo como esto:

Dim Stream as Stream = ReadToStream(Text, System.Text.Encoding.UTF8) 
Dim Image As New Drawing.Bitmap(Stream) 

EDIT:

Este motor se utilizó principalmente para descargando páginas web, pero estoy tratando de usarlo para descargar imágenes también. El formato de la cadena es UTF-8, como se indica en el código de ejemplo ...

He intentado utilizar el MemoryStream(Encoding.UTF8.GetBytes(Text)), pero me dio este error al cargar la corriente a la imagen:

Se produjo un error genérico en GDI +.

¿Qué se pierde en las conversiones?

+0

Voy a revisar tu edición –

Respuesta

38

¿Por qué ha convertido datos binarios (imágenes) a una cadena? Esto no tiene sentido ... a menos que estés usando base-64?

De todos modos, para revertir lo que has hecho, podrías intentar usar new MemoryStream(Encoding.UTF8.GetBytes(text))?

Esto creará un nuevo MemoryStream preparado con la cuerda (a través de UTF8). Personalmente, dudo que funcione: se encontrará con muchos problemas de codificación que tratan datos binarios sin procesar como datos UTF8 ... Espero que la lectura o la escritura (o ambas) arrojen una excepción.

(editar)

debo añadir que para trabajar con la base-64, sólo tiene que obtener los datos como un byte[], a continuación, llamar Convert.ToBase64String(...); y para recuperar la matriz, simplemente use Convert.FromBase64String(...).


Re tu edición, esto es precisamente lo que he tratado de advertir sobre encima ... en .NET, una cadena no es sólo un byte[], por lo que no se puede simplemente llenarlo con los datos de imagen binarios. Muchos de los datos simplemente no tendrán sentido para la codificación, por lo que se pueden descartar silenciosamente (o lanzarse una excepción).

Para manejar binarios en bruto (como imágenes) como cadenas, debe usar codificación base-64; esto agrega tamaño, sin embargo. Tenga en cuenta que WebClient podría hacerlo mas simple, ya que expone byte[] funcionalidad directamente:

using(WebClient wc = new WebClient()) { 
    byte[] raw = wc.DownloadData("http://www.google.com/images/nav_logo.png") 
    //... 
} 

De todos modos, el uso de un Stream enfoque estándar, así es como para codificar y decodificar la base 64:

 // ENCODE 
     // where "s" is our original stream 
     string base64; 
     // first I need the data as a byte[]; I'll use 
     // MemoryStream, as a convenience; if you already 
     // have the byte[] you can skip this 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      byte[] buffer = new byte[1024]; 
      int bytesRead; 
      while ((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, bytesRead); 
      } 
      base64 = Convert.ToBase64String(ms.GetBuffer(), 0, (int) ms.Length); 
     } 

     // DECODE 
     byte[] raw = Convert.FromBase64String(base64); 
     using (MemoryStream decoded = new MemoryStream(raw)) 
     { 
      // "decoded" now primed with the binary 
     } 
2

Será este ¿trabajo?No tengo idea de en qué formato se encuentra su cadena, por lo que puede ser necesario algún masaje.

Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text) 
Dim ms as New System.IO.MemoryStream(strAsBytes) 
1

La conversión de datos binarios a una cadena en la forma que ha mostrado lo hará inútil. No puedes sacarlo del paquete. La codificación de texto lo manguera.

Necesita mostrar Base64, como @Marc.

1
var bytes = new byte[contents.Length * sizeof(char)]; 
Buffer.BlockCopy(contents.ToCharArray(), 0, bytes, 0, bytes.Length); 
using(var stream = new MemoryStream(bytes)) 
{ 
    // do your stuff with the stream... 
}