使用StreamReader复制图像时出现损坏

时间:2009-10-28 05:02:24

标签: c# .net windows-mobile

是代码中的问题.. 我正在尝试读取.gif文件并写入另一个.gif文件,如果我这样做...新创建的.gif文件将无法显示正确的图像,而垃圾图像来自于代码中的错误。

 private void ReadFile()
    {
        StreamReader MyReader = new StreamReader(@"C:\\Users\\admin\\Desktop\\apache_pb22_ani.gif");
        string ReadFile= MyReader.ReadToEnd();
        MyReader .Close ();

        StreamWriter MYWriter = new StreamWriter(@"C:\\Hi.gif");
        MYWriter.Write(ReadFile);
        MYWriter.Close();

        //throw new NotImplementedException();
    }

如果我从服务器读取图像,如果我写入图像文件也出现同样的问题,那么问题是什么...... 从服务器和写作中读取图像的代码在这里

StringBuilder sb = new StringBuilder();
        // used on each read operation
        byte[] buf = new byte[8192];
        // prepare the web page we will be asking for
        HttpWebRequest request = (HttpWebRequest)
                WebRequest.Create("http://10.10.21.178/Untitled.jpg");
        // execute the request
        HttpWebResponse response = (HttpWebResponse)
                request.GetResponse();
        // we will read data via the response stream
        Stream resStream = response.GetResponseStream();

        string tempString = null;
        int count = 0;

        StreamWriter FileWriter = new StreamWriter("C:\\Testing.jpg");


        do
        {
            // fill the buffer with data
            count = resStream.Read(buf, 0, buf.Length);
            // make sure we read some data
            if (count != 0)
            {
                // translate from bytes to ASCII text. 
                // Not needed if you'll get binary content.

                tempString = Encoding.ASCII.GetString(buf, 0, count);
                FileWriter.Write(tempString);
                // continue building the string
                sb.Append(tempString);
            }
        }
        while (count > 0); // any more data to read?

        FileWriter.Close();

        // print out page source
       // Console.WriteLine(sb.ToString());
        //throw new NotImplementedException();
    }

4 个答案:

答案 0 :(得分:7)

二进制数据(如图像)在.NET字符串中不起作用;你想要的东西(假设File.Copy不是一个选项):

using(Stream source = File.OpenRead(fromPath))
using(Stream dest = File.Create(toPath)) {
    byte[] buffer = new byte[1024];
    int bytes;
    while((bytes = source.Read(buffer, 0, buffer.Length)) > 0) {
        dest.Write(buffer, 0, bytes);
    }
}

这会将图像视为二进制(byte[]),并使用缓冲区/循环来避免在图像较大时发生爆炸(File.ReadAllBytes可能很昂贵)。

答案 1 :(得分:2)

您无法将GIF文件(二进制)读入字符串变量。

您需要读入一个字节数组。

答案 2 :(得分:2)

您不想使用ReadToEnd(),即文本文件。尝试File.ReadAllBytes(),它会将二进制文件读入字节数组。然后,您可以使用File.WriteAllBytes()将该文件写回磁盘。

答案 3 :(得分:0)

string使用UTF16。我是对的吗?

这意味着您的代码将ASCII转换为UTF16。 :)

此外,您无法理解@符号的含义。如果要避免双反斜杠,请将其放在字符串前面。您的代码@"C:\\Hi.gif"应为"C:\\Hi.gif"@"C:\Hi.gif"