In my app, i use HttpWebRequest to get picture data from server, then set the data into a BitmapImage, which is finally set as source of an image control. Background code and XAML are shown below:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO;
using System.Windows.Media.Imaging;

namespace TestImageDownloading
{
    public partial class MainPage : PhoneApplicationPage
    {

        // Constructor
        public MainPage()
        {
            InitializeComponent();

            //#1  A narrow and tall picture gets the problem:
            Uri uri = new Uri("http://t1.qpic.cn/mblogpic/79442e7095e63fe941fc/2000", UriKind.Absolute);

            //#2  Other pictures seems to be right:
            ///// Uri uri = new Uri("http://t1.qpic.cn/mblogpic/919f93bde512a2137bce/2000", UriKind.Absolute);
            
            var request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "GET";
            request.Accept = "image/*";
            request.BeginGetResponse(asyncResult =>
            {
                var response = (HttpWebResponse)request.EndGetResponse(asyncResult);
                int length = Int32.Parse(response.ContentLength.ToString());
                var byteData = new byte[length];
                using (var reader = new BinaryReader(response.GetResponseStream()))
                {
                    reader.Read(byteData, 0, length);
                }

                MemoryStream ms = new MemoryStream(byteData);
                Dispatcher.BeginInvoke(() =>
                {
                    BitmapImage bmp = new BitmapImage();
                    bmp.SetSource(ms);
                    /*Set breakpoint at the above line, to check the BitmapImage's PixelWidth&PixelHeight,
                     * and total size of the stream's buffer
                     */
                    imageBox.Source = bmp;
                    ms.Dispose();
                });
            }, request);
        }
    }
}
HTML Code:
<phone:PhoneApplicationPage 
    x:Class="TestImageDownloading.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <Grid x:Name="LayoutRoot" >
        <Image x:Name="imageBox" Stretch="None" />
    </Grid>

</phone:PhoneApplicationPage>
Something strange happens when getting pictures with long height and short width: After bmp.SetSource(ms), you can see its PixelHeight and PixelWidth are quarter of those of the correct picture(to confirm this, just open the picture's url in browser and save it as file). But length of buffer of the stream is equal to the size of the picture file. And other pictures have no suck problem !
Why does it happen? And how to make the downloaded BitmapImage correct ?