23

インターネットから画像をダウンロードし、文字列に変換しました (これは変更できません)

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

String を Stream に戻すにはどうすればよいですか?

したがって、そのストリームを使用して画像を取得できます。

このような:

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

しかし、今はテキスト文字列しかないので、次のようなものが必要です:

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

編集:

このエンジンは主に Web ページのダウンロードに使用されていましたが、画像のダウンロードにも使用しようとしています。コード例に示されているように、文字列の形式はUTF8です...

を使用しようとしましたMemoryStream(Encoding.UTF8.GetBytes(Text))が、ストリームをイメージにロードするときに次のエラーが発生しました。

GDI+ で一般的なエラーが発生しました。

変換で失われるものは何ですか?

4

4 に答える 4

40

バイナリ (画像) データを文字列に変換したのはなぜですか? これは意味がありません... base-64を使用していない限り?

とにかく、行ったことを元に戻すには、new MemoryStream(Encoding.UTF8.GetBytes(text))?を使用してみてください。

これにより、(UTF8 を介して) 文字列でプライミングされた新しい MemoryStream が作成されます。個人的には、それがうまくいくとは思えません-生のバイナリをUTF8データとして扱う多くのエンコーディングの問題に遭遇するでしょう...読み取りまたは書き込み(または両方)のいずれかが例外をスローすると予想します。

(編集)

base-64 で動作するように追加する必要があります。単にデータを として取得してから;byte[]を呼び出します。Convert.ToBase64String(...)配列を取得するには、単に使用しますConvert.FromBase64String(...)


あなたの編集について、これはまさに私が上で警告しようとしたことです... .NETでは、文字列は単なる abyte[]ではないため、単純にバイナリ画像データで埋めることはできません。多くのデータはエンコーディングでは意味をなさないため、静かにドロップされる (または例外がスローされる) 可能性があります。

生のバイナリ (画像など) を文字列として処理するには、base-64 エンコーディングを使用する必要があります。ただし、これによりサイズが大きくなります。機能を直接WebClient公開するため、これがより簡単になる可能性があることに注意してください。byte[]

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

とにかく、標準的なStreamアプローチを使用して、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
        }
于 2008-12-08T22:22:15.797 に答える
4

これは機能しますか?文字列の形式がわからないため、何らかのマッサージが必要になる場合があります。

Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text)
Dim ms as New System.IO.MemoryStream(strAsBytes)
于 2008-12-08T22:23:50.430 に答える
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...
}
于 2012-08-07T18:00:21.193 に答える
1

あなたが示した方法でバイナリデータを文字列に変換すると、役に立たなくなります。パックを引き出すことはできません。テキストエンコーディングはそれをホースします。

@Marcが示すように、Base64を使用する必要があります。

于 2008-12-09T00:19:03.207 に答える