0

所以,我有这两种方法,用于序列化和反序列化图像:

private static Image GetImageFromString(string image)
        {
            using (var stream = new MemoryStream(Convert.FromBase64String(image)))
            {
                return Image.FromStream(stream);
            }
        }

private static string GetImageAsString(Image image)
        {
            using (var stream = new MemoryStream())
            {
                image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);

                return Convert.ToBase64String(stream.GetBuffer());
            }
        }

如果我做这样的事情:

public Form1()
        {
            InitializeComponent();

            var image = Image.FromFile(@"F:\phpide.png");

            pictureBox1.Image = image;

            var serialized = GetImageAsString(image);

            var secondImage = GetImageFromString(serialized);

            pictureBox2.Image = secondImage;
        }

它按预期工作

虽然,如果我这样做:

//client
    public void GetImage(JObject o)
            {
                var imageFile = o["file"].ToString();

                if (!File.Exists(imageFile))
                {
                    SendMessage("File does not exist");
                    return;
                }

                using (var image = Image.FromFile(imageFile))
                {
                    var serialized = GetImageAsString(image);

                    var ob = new JObject
                        {
                            { COMMAND, (int) Command.GetImage },
                            { "content", serialized }
                        };

                    Send(ob);

                    ob = null;

                    serialized = null;
                }
            }

//server
    public void ReceiveImage(JObject o)
            {
                var content = o["content"].ToString();

                var image = GetImageFromString(content);

                var form = new ImagePreviewForm(image);

                form.Show();
            }

//server

    public ImagePreviewForm(Image image)
            {
                InitializeComponent();

                pictureBox1.Image = image;
            }

图像只是空白。

我已经检查并且图像被正确接收,没有数据丢失。

这里可能出了什么问题?我应该去哪里看?

4

2 回答 2

1

这至少是一个问题:

return Convert.ToBase64String(stream.GetBuffer());

你不应该MemoryStream.GetBuffer在这里使用 - 你应该使用ToArray. 该方法按原样GetBuffer返回底层缓冲区......在缓冲区末尾包含垃圾数据,超出了流的逻辑当前长度。

此外,您不应在调用Image.FromStream. 从文档:

您必须在图像的生命周期内保持流打开。

所以去掉using.GetImageFromString

于 2013-05-17T21:46:31.103 回答
0

使用该using语句,您将在 UI 线程可以正确显示图像之前处理图像。将代码从块中取出,并在 Form.Close() 方法中using添加一条语句。Dispose()

于 2013-05-17T21:46:20.413 回答