我有两种方法,一种用于将图像转换为Base64字符串,因此我可以将其存储在XML标记中,另一种方法将Base64字符串转换回图像。我能够将图像转换为字符串并将其存储在XML中,但是当我尝试将字符串转换回图像时,我收到以下错误:“GZip标头中的幻数不正确。确定你传递的是GZip流。“
有关如何解决此问题的任何想法?
public static string ConvertToBase64String(Image Image, ImageFormat Format)
{
MemoryStream stream = new MemoryStream();
Image.Save(stream, Format);
byte[] imageBytes = stream.ToArray();
MemoryStream memStream = new MemoryStream();
GZipStream zipStream = new GZipStream(memStream, CompressionMode.Compress);
zipStream.Write(imageBytes, 0, imageBytes.Length);
string imageString = Convert.ToBase64String(imageBytes);
stream.Close();
memStream.Close();
return imageString;
}
public static Image Base64StringToImage(string ImageArray)
{
byte[] base64String = Convert.FromBase64String(ImageArray);
MemoryStream memStream = new MemoryStream(base64String);
GZipStream zipStream = new GZipStream(memStream, CompressionMode.Decompress);
zipStream.Read(base64String, 0, base64String.Length);
ImageConverter ic = new ImageConverter();
Image image = (Image)ic.ConvertFrom(base64String);
memStream.Close();
return image;
}
答案 0 :(得分:6)
我在代码中看到了几个错误。
导致错误消息的问题是您未转换为base 64字符串的内容不是压缩数据(memStream.ToArray()
),而是您写入zip流的数据({{1 }})。当您尝试解压缩未压缩的数据时,您会收到错误消息。
另一个主要问题是您只是从zip流中读取部分数据,因为您使用压缩数据的大小作为从zip流中读取多少的大小。
此外,您忽略了imageBytes
方法的结果。它返回实际放置在数组中的字节数,可以小于请求的字节数。由于Read
方法不必返回所有可用数据,因此必须循环,直到实际获得流中的所有数据。当没有更多数据要读取时,Read
方法将返回零。
另一个问题是您正在写入您正在使用的数组作为您正在读取的内存流的后端。由于解压缩的数据通常比压缩数据大,因此您将比读取数据更快地覆盖数据。但是,由于解压缩的数据不适合数组,因此无论如何都不能使用它。