保存图片流至文本文件后加载PictureBox报错“Parameter is not valid”求助
问题分析与修正
你的核心错误是没有正确将图片的二进制数据序列化到文本文件,而是直接写入了MemoryStream对象的字符串表示,导致读取时无法还原出有效的图片流。
错误原因拆解
保存阶段:
代码中sw.WriteLine($"{username},{stream}")这一行,实际输出的是MemoryStream对象的ToString()结果(即字符串System.IO.MemoryStream),而不是流中的图片二进制数据。文本文件里根本没存图片的真实内容。读取阶段:
你把这个无效的字符串用Encoding.ASCII.GetBytes()转成字节数组,再试图生成图片,自然会抛出"Parameter is not valid"——因为这些字节完全不是JPEG格式的有效数据。
修正后的代码
1. 正确保存图片到文本文件(用Base64编码二进制数据)
customavatar = Image.FromFile(filename); using (var stream = new System.IO.MemoryStream()) { customavatar.Save(stream, ImageFormat.Jpeg); // 将流的字节数组转成Base64字符串,方便存储到文本 string imgBase64 = Convert.ToBase64String(stream.ToArray()); // File.AppendText会自动创建不存在的文件,无需单独判断 using (StreamWriter sw = File.AppendText(textfile)) { sw.WriteLine($"{username},{imgBase64}"); } }
2. 正确从文本文件读取并加载图片
string[] filelinesarray = File.ReadAllLines(textfile); foreach (string str in filelinesarray) { // 跳过空行,避免拆分报错 if (string.IsNullOrWhiteSpace(str)) continue; string[] parts = str.Split(','); // 确保行格式符合预期,避免索引越界 if (parts.Length < 2) continue; if (parts[0] == username) { try { // 将Base64字符串转回字节数组 byte[] byteArray = Convert.FromBase64String(parts[1]); using (MemoryStream stream = new MemoryStream(byteArray)) { Image img = Image.FromStream(stream); // 释放PictureBox旧图片资源,避免内存泄漏 picturebox.Image?.Dispose(); picturebox.Image = img; } } catch (FormatException) { MessageBox.Show("图片数据格式错误"); } catch (ArgumentException) { MessageBox.Show("无法加载图片,数据无效"); } } }
额外优化建议
- 避免用逗号做分隔符:如果用户名包含逗号,会导致拆分错误,可改用
|等特殊字符,或对用户名进行转义处理。 - 资源管理:操作
Image和Stream时始终用using语句,确保资源及时释放。
内容的提问来源于stack exchange,提问作者Órán McKiernan
相关产品推荐
相关产品推荐

