WCF/REST Get image into picturebox?

Posted by Garrith on Stack Overflow See other posts from Stack Overflow or by Garrith
Published on 2012-04-04T15:54:01Z Indexed on 2012/04/04 17:28 UTC
Read the original article Hit count: 184

Filed under:
|
|
|

So I have wcf rest service which succesfuly runs from a console app, if I navigate to: http://localhost:8000/Service/picture/300/400 my image is displayed note the 300/400 sets the width and height of the image within the body of the html page.

The code looks like this:

namespace WcfServiceLibrary1
{
    [ServiceContract]
    public interface IReceiveData
    {
        [OperationContract]
        [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "picture/{width}/{height}")]
        Stream GetImage(string width, string height);
    }
    public class RawDataService : IReceiveData
    {
        public Stream GetImage(string width, string height)
        {
                int w, h;

                if (!Int32.TryParse(width, out w))
                {
                    w = 640;
                }
                // Handle error
                if (!Int32.TryParse(height, out h))
                {
                    h = 400;
                }
            Bitmap bitmap = new Bitmap(w, h); 
            for (int i = 0; i < bitmap.Width; i++)
            {
                for (int j = 0; j < bitmap.Height; j++)
                {
                    bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow);
                }
            }
            MemoryStream ms = new MemoryStream();
            bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Position = 0;
            WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
            return ms;
        }
    }
}

What I want to do now is use a client application "my windows form app" and add that image into a picturebox. Im abit stuck as to how this can be achieved as I would like the width and height of the image from my wcf rest service to be set by the width and height of the picturebox. I have tryed this but on two of the lines have errors and im not even sure if it will work as the code for my wcf rest service seperates width and height with a "/" if you notice in the url.

    string uri = "http://localhost:8080/Service/picture";
    private void button1_Click(object sender, EventArgs e)
    {

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("<picture>");
        sb.AppendLine("<width>" + pictureBox1.Image.Width + "</width>");
        // the url looks like this http://localhost:8080/Service/picture/300/400 when accessing the image so I am trying to set this here
        sb.AppendLine("<height>" + pictureBox1.Image.Height + "</height>");
        sb.AppendLine("</picture>");
        string picture = sb.ToString();
        byte[] getimage = Encoding.UTF8.GetBytes(picture); // not sure this is right
        HttpWebRequest req = WebRequest.Create(uri); //cant convert webrequest to httpwebrequest
        req.Method = "GET";
        req.ContentType = "image/jpg";
        req.ContentLength = getimage.Length; 
        MemoryStream reqStrm = req.GetRequestStream(); //cant convert IO stream to IO Memory stream
        reqStrm.Write(getimage, 0, getimage.Length); 
        reqStrm.Close();
        HttpWebResponse resp = req.GetResponse(); // cant convert web respone to httpwebresponse
        MessageBox.Show(resp.StatusDescription);
        pictureBox1.Image = Image.FromStream(reqStrm);
        reqStrm.Close();
        resp.Close();
    }

So just wondering if some one could help me out with this futile attempt at adding a variable image size from my rest service to a picture box on button click.

This is the host app aswell:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            ServiceHost host = new ServiceHost(typeof(RawDataService), new Uri(baseAddress));
            host.AddServiceEndpoint(typeof(IReceiveData), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
            host.Open();
            Console.WriteLine("Host opened");
            Console.ReadLine();

© Stack Overflow or respective owner

Related posts about c#

Related posts about wpf