关于windowsphone载入超过2048大图的方法!

来源:互联网 发布:nokia5300软件下载 编辑:程序博客网 时间:2024/06/05 15:33

众所周知,windowsphone7.0、7.1、8.0均无法载入超过2048像素的控件,所以要显示长图片就很费劲了。

目前有两个方法可以显示:

1、浏览器。 

 优点:支持放大缩小,滑动流畅等

缺点:有时候感觉不正规,不能左右切换图片。

2、分割图片拼接方式显示。

优点:感觉正规。

缺点:不能放大缩小了,且需要一点时间来进行解码分割。

说一下思路吧,载入图片的流然后从流里读取图片的高宽,如果大于2000的话则截取N多小图片然后添加到一个容器里。将会正确显示。

当然了,如果获取高宽直接设置的话也是可以显示出来的。可是会遇到一系列问题。如storyboard在操作一个超过2048的图片时会出现白边之类的。

有兴趣可以试一试

下面上码:

图片:http://ww4.sinaimg.cn/bmiddle/974f2750jw1duzsl9gq4dj.jpg 

长度:21539

首先载入图片

xaml

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            <ScrollViewer   x:Name="ImageScrollViewer">                <StackPanel x:Name="ImageBox">                    <Button Content="点我" Height="72" Name="button1" Width="205" Click="button1_Click" />                </StackPanel>            </ScrollViewer>        </Grid>


  WebClient web = new WebClient();            web.OpenReadCompleted += new OpenReadCompletedEventHandler(web_OpenReadCompleted);            web.OpenReadAsync(new Uri("http://ww4.sinaimg.cn/bmiddle/974f2750jw1duzsl9gq4dj.jpg", UriKind.Absolute));


在回调里分割图片

        /// <summary>        /// 图片最高为2000 如果超过2000则要进行分割。        /// </summary>        private const int KMaxImageHeight = 2000;        void web_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)        {            using (Stream ms = e.Result as Stream)            {                byte[] bytes = new byte[ms.Length];                ms.Read(bytes, 0, bytes.Length);                ms.Seek(0, SeekOrigin.Begin);                byte[] bytesimg = new byte[2] { 0xFF, 0xC0 };                byte[] byteImgW = new byte[2];//宽度                byte[] byteImgH = new byte[2];//高度                for (int i = 0; i < bytes.Length; i++)                {                    if (bytes[i] == bytesimg[0] && bytes[i + 1] == bytesimg[1])                    {                        byteImgH = new byte[2] { bytes[i + 5], bytes[i + 6] };                        byteImgW = new byte[2] { bytes[i + 7], bytes[i + 8] };                        break;                    }                }                string strImgH = byteImgH[0].ToString("X2") + byteImgH[1].ToString("X2");                string strImgW = byteImgW[0].ToString("X2") + byteImgW[1].ToString("X2");                //图片的原始高度和宽度                double BaseImageHeight = Convert.ToInt32(strImgH, 16);                double BaseImageWidth = Convert.ToInt32(strImgW, 16);                BaseImageHeight = BaseImageWidth > 480 ? BaseImageHeight * 480 / BaseImageWidth : BaseImageHeight;                BaseImageWidth = BaseImageWidth > 480 ? 480 : BaseImageWidth;                WriteableBitmap wb = new WriteableBitmap(Convert.ToInt32(BaseImageWidth), Convert.ToInt32(BaseImageHeight));                wb.LoadJpeg(e.Result);                Image ImgBase = new Image();                ImgBase.Source = wb;                ImgBase.Stretch = Stretch.None;                if (BaseImageHeight > KMaxImageHeight)                {                    for (int i = KMaxImageHeight; i < BaseImageHeight + KMaxImageHeight; i += KMaxImageHeight)                    {                        int imageHeight = KMaxImageHeight;                        if (i > BaseImageHeight)                        {                            imageHeight = Convert.ToInt32(BaseImageHeight) - KMaxImageHeight * (i / KMaxImageHeight - 1);                        }                        //图片变换。                        TranslateTransform translate = new TranslateTransform();                        translate.Y = -(i - KMaxImageHeight);                        //bitmap                        WriteableBitmap wbitmap = new WriteableBitmap(Convert.ToInt32(BaseImageWidth), imageHeight > KMaxImageHeight ? imageHeight - KMaxImageHeight : imageHeight);                        wbitmap.Render(ImgBase, translate);                        wbitmap.Invalidate();                        //图片                        Image image = new Image();                        image.Source = wbitmap;                        image.Width = wbitmap.PixelWidth;                        image.Height = wbitmap.PixelHeight;                        image.Margin = new Thickness(0, -1, 0, 0);                        ImageBox.Children.Add(image);                    }                }                else                {                    ImageBox.Children.Add(ImgBase);                }                bytes = null;                WriteableBitmap bitmap = ImgBase.Source as WriteableBitmap;                if (bitmap != null)                {                    bitmap = null;                }                ImgBase.Source = null;                ImgBase.Visibility = Visibility.Collapsed;                ImgBase = null;                ms.Dispose();            }        }



原创粉丝点击