1

我有一个 Windows 手机应用程序,它拍摄一张照片并将其发送到 wcf 服务,该服务将其发送到数据库,以便另一个应用程序(Windows 窗体应用程序)可以检查数据库并获取图像。

它将数据作为字节数组添加到数据库中,但是当我检查这些值时,它们都说相同的数字,但它似乎有效,因为它们的数据在那里。

但是,当我尝试将该数据转换为图像时,它会引发异常,说明该参数无效。我已经搜索了如何做到这一点,但我发现(甚至在这里)正是我在做什么。所以我不确定出了什么问题。

这是我的 windows phone 代码:

if (e.TaskResult == TaskResult.OK)
        {
            var bitImage = new BitmapImage();
            bitImage.SetSource(e.ChosenPhoto);
            //image is a Image Control in the form
            ImageServiceClient client = new ImageServiceClient();

            byte[] array;
            using(var stream = new MemoryStream())
            {
                var btmMap = new WriteableBitmap(bitImage.PixelWidth, bitImage.PixelHeight);

                // write an image into the stream
                btmMap.SaveJpeg(stream, bitImage.PixelWidth, bitImage.PixelHeight, 0, 100);
                array = stream.ToArray();
            }
            client.AddImageAsync(array);
        }

最后一行调用我的 wcf 服务中的 add 方法,如下所示:

public void AddImage(byte[] array)
    {
        var con =
            new MySqlConnection(
                "server=instance11297.db.xeround.com;User Id=Admin;Password=nomoredrama2010;port=7692;database=capstone");
       con.Open();
        string h = array.Aggregate(h, (current, b) => current + b);
        string text = "INSERT INTO images VALUES (''," + h + ")";
        Console.WriteLine(text);
        var command = new MySqlCommand(text, con);
        var result = command.ExecuteReader();
       result.Close();
    }

值得注意的是,无论我是直接使用传入的数组还是将其转换为文本,它们都在数据库中显示相同。

最后,在将所有内容发送到的应用程序中,我有这个:

var con =
            new MySqlConnection(
                "server=instance11297.db.xeround.com;User Id=Admin;Password=nomoredrama2010;port=7692;database=capstone");
        con.Open();
        string h = "";
        string text = "select Image from images where ImageId=4";
        var command = new MySqlCommand(text, con);
        var dr = command.ExecuteReader();
        var g = new byte[] {};
        if(dr.Read())
          g = (byte[])dr[0];
        dr.Close();
        var image = Image.FromStream(new MemoryStream(g));
        pictureBox1.Image = image;

但它总是在“var image = Image.FromStream(new MemoryStream(g));”上中断 说参数无效。

我发现它在获取图像后有一个大数组,但数据库中的那个只有 65 个字节,而且都说 57。

为什么它完全无视我的图像数组并将其替换为所有 57 个字节中的一个 65 个字节?

我究竟做错了什么?

** * ** * ** * ** * ***编辑* ** * ** * ** * ** * ** * ** * ** * ** * ****

在 wcf 应用程序中启用调试器后,我终于发现了问题所在。 http://msdn.microsoft.com/en-us/library/ff649234.aspx(对于那些不知道的人)

我也看过这里: http: //www.codeproject.com/Articles/9686/Save-An-Image-Into-SQL-Server-2000-Database

看看为什么它会抛出“你的 sql 是错误的”类型错误,并将我的 sql 语句更改为使用添加方法而不是将值放入字符串中。

最终解决了它。其他人遇到此问题的工作代码如下所示:

public void AddImage(byte[] array)
    {
        var con =
            new MySqlConnection("server=instance11297.db.xeround.com;User Id=Admin;Password=nomoredrama2010;port=7692;database=capstone");
        con.Open();
        string text = "INSERT INTO images (ImageId, Image) VALUES ('',@bytes)";
        var command = new MySqlCommand(text, con);
        command.Parameters.AddWithValue("@bytes", array);
        command.ExecuteNonQuery();
        con.Close();
    }

我终于可以停止用头撞墙了。:)

4

1 回答 1

1

你应该使用这样的东西。

//---读取缓冲区中的数据并写入ms2---

MemoryStream ms2 = new MemoryStream();

ms2.Write(b, 0, b.Lenght);

//---将其加载到 PictureBox 控件中---

pictureBox2.Image = new Bitmap(ms2);

于 2012-04-16T23:16:47.143 回答