gif win8 1-使用BitmapDecoder读取GIF图片的问题 Win8.1 WP8.1 appx

问题描述

使用BitmapDecoder读取GIF图片的问题 Win8.1 WP8.1 appx
    private string filename = "8.gif";

    private List<WriteableBitmap> list = new List<WriteableBitmap>();

    async void hf_FileCompeted(int code, object sender)
    {

        Windows.Storage.StorageFolder localFolder = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("image", Windows.Storage.CreationCollisionOption.OpenIfExists);
        IStorageFile fileinto = await localFolder.GetFileAsync(filename);
        IRandomAccessStream ias = await fileinto.OpenReadAsync();
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, ias);

        System.Diagnostics.Debug.WriteLine("总的帧数:" + decoder.FrameCount.ToString());

        Print(decoder.PixelHeight + ":" + decoder.PixelWidth);

        for (int k = 0; k < (int)decoder.FrameCount; k++)
        {
            // 获取第一帧
            BitmapFrame frame = await decoder.GetFrameAsync((uint)k);
            // 获取像素数据
            PixelDataProvider pixprd = await frame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, new BitmapTransform(), ExifOrientationMode.RespectExifOrientation, ColorManagementMode.DoNotColorManage);

            Print(frame.DpiX+":"+frame.DpiY+":"+frame.OrientedPixelHeight+":"+frame.OrientedPixelWidth+":"+frame.PixelHeight+":"+frame.PixelWidth);

            var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
            await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                // 创建新的位图对象
                WriteableBitmap wb = new WriteableBitmap((int)frame.PixelWidth, (int)frame.PixelHeight);
                byte[] data = pixprd.DetachPixelData();

                data.CopyTo(wb.PixelBuffer);
                wb.Invalidate();
                list.Add(wb);
            }
            );

        }

        time = new System.Threading.Timer(new TimerCallback(timerReport), null, 300, 0);

    }

    private void Print(string str)
    {
        System.Diagnostics.Debug.WriteLine(str);
    }

    System.Threading.Timer time;
    private int kindex = 0;
    /// <summary>
    /// 计时器检查链接和心跳包
    /// </summary>
    /// <param name="obj"></param>
    private async void timerReport(object obj)
    {
        try
        {
            time.Change(300, 0);
            kindex++;
            if (kindex >= 8)
            {
                kindex = 0;
            }

            var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
            await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                img.Source = list[kindex];
            });

        }
        catch
        {
        }
    }

解决方案

代码的意思是,从存储区读取文件,然后通过那个BitmapDecoder读取图片的信息,获得gif的帧数和每一帧的数据,然后存在一个list里面,最后通过时间切换,这是一个简单的例子。很多东西没有附加

解决方案二:

问题在于,图片背景是白色的!!!

应是透明的撒,怎么搞? 谢谢!

解决方案三:

    /// <summary>
    /// 文件的后缀名
    /// </summary>
    private string filename = "12.gif";
    /// <summary>
    /// 帧信息的组
    /// </summary>
    private List<Image> list = new List<Image>();
    /// <summary>
    /// 共有多少帧
    /// </summary>
    private int framecount = 0;

    /// <summary>
    /// 文件下载完成后
    /// </summary>
    /// <param name="code"></param>
    /// <param name="sender"></param>
    private async void hf_FileCompeted(int code, object sender)
    {

        Windows.Storage.StorageFolder localFolder = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("image", Windows.Storage.CreationCollisionOption.OpenIfExists);
        IStorageFile fileinto = await localFolder.GetFileAsync(filename);
        IRandomAccessStream ias = await fileinto.OpenReadAsync();
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.GifDecoderId, ias);

        framecount = (int)decoder.FrameCount;
        System.Diagnostics.Debug.WriteLine("总的帧数:" + decoder.FrameCount.ToString());

        Print(decoder.PixelHeight + ":" + decoder.PixelWidth);

        for (int k = 0; k < (int)decoder.FrameCount; k++)
        {

            BitmapFrame frame = await decoder.GetFrameAsync((uint)k);

            var frameProperties = await frame.BitmapProperties.GetPropertiesAsync(new List<string>());

            var imageDescriptionProperties = await (frameProperties["/imgdesc"].Value as BitmapPropertiesView).GetPropertiesAsync(new List<string>() { "/Top", "/Left", "/Width", "/Height" });
            int top = Int32.Parse(imageDescriptionProperties["/Top"].Value.ToString());
            int left = Int32.Parse(imageDescriptionProperties["/Left"].Value.ToString());
            int width = Int32.Parse(imageDescriptionProperties["/Width"].Value.ToString());
            int height = Int32.Parse(imageDescriptionProperties["/Height"].Value.ToString());

            var gifControlExtensionProperties = await (frameProperties["/grctlext"].Value as BitmapPropertiesView).GetPropertiesAsync(new List<string>() { "/Delay", "/UserInputFlag" });
            TimeSpan delay = TimeSpan.FromSeconds(Double.Parse(gifControlExtensionProperties["/Delay"].Value.ToString()) / 100); // delay is in 1/100s of a second
            bool userInputFlag = bool.Parse(gifControlExtensionProperties["/UserInputFlag"].Value.ToString());

            Print(top+"::"+left+"::"+width+"::"+height);

            // 获取像素数据
            PixelDataProvider pixprd = await frame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, new BitmapTransform(), ExifOrientationMode.RespectExifOrientation, ColorManagementMode.DoNotColorManage);

            Print(frame.DpiX + ":" + frame.DpiY + ":" + frame.OrientedPixelHeight + ":" + frame.OrientedPixelWidth + ":" + frame.PixelHeight + ":" + frame.PixelWidth);

            var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
            await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                // 创建新的位图对象
                WriteableBitmap wb = new WriteableBitmap((int)frame.PixelWidth, (int)frame.PixelHeight);
                byte[] data = pixprd.DetachPixelData();

                data.CopyTo(wb.PixelBuffer);
                wb.Invalidate();

                Image img = new Image();
                img.Width = width * 2;
                img.Height = height * 2;
                img.VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Top;
                img.HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Left;
                img.Margin = new Thickness(left * 2, top * 2, 0, 0);
                img.Source = wb;
                Canvas.SetZIndex(img, k);

                list.Add(img);

                can.Children.Add(img);
            }
            );

        }

        //for (int k = 0; k < (int)decoder.FrameCount; k++)
        //{
        //    // 获取第一帧
        //    BitmapFrame frame = await decoder.GetFrameAsync((uint)k);
        //    // 获取像素数据
        //    PixelDataProvider pixprd = await frame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, new BitmapTransform(), ExifOrientationMode.RespectExifOrientation, ColorManagementMode.DoNotColorManage);

        //    Print(frame.DpiX+":"+frame.DpiY+":"+frame.OrientedPixelHeight+":"+frame.OrientedPixelWidth+":"+frame.PixelHeight+":"+frame.PixelWidth);

        //    var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
        //    await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        //    {
        //        // 创建新的位图对象
        //        WriteableBitmap wb = new WriteableBitmap((int)frame.PixelWidth, (int)frame.PixelHeight);
        //        byte[] data = pixprd.DetachPixelData();

        //        data.CopyTo(wb.PixelBuffer);
        //        wb.Invalidate();
        //        list.Add(wb);
        //    }
        //    );

        //}

        time = new System.Threading.Timer(new TimerCallback(timerReport), null, 300, 0);

    }

    private void Print(string str)
    {
        System.Diagnostics.Debug.WriteLine(str);
    }

    System.Threading.Timer time;
    /// <summary>
    /// 当前显示第几帧
    /// </summary>
    private int kindex = 0;
    /// <summary>
    /// 计时器检查链接和心跳包
    /// </summary>
    /// <param name="obj"></param>
    private async void timerReport(object obj)
    {
        try
        {
            time.Change(200, 0);
            kindex++;
            if (kindex >= framecount)
            {
                kindex = 0;
            }

            var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
            await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {

                Canvas.SetZIndex(list[kindex],framecount);
                if (kindex == 0)
                {
                    Canvas.SetZIndex(list[framecount - 1], 0);
                }
                else
                {
                    Canvas.SetZIndex(list[kindex-1],0);
                }
            });
        }
        catch
        {
        }
    }

解决方案四:

就差背景色是白色的问题了,没人来么?

解决方案五:

兄弟,印象中gif不支持透明,png才支持,找点资料确认一下,实在不行,自己实现一个gif,用一个timer,多帧循环播。

时间: 2024-07-28 20:20:52

gif win8 1-使用BitmapDecoder读取GIF图片的问题 Win8.1 WP8.1 appx的相关文章

如何让Win8系统照片应用显示电脑中图片

  我们点击Win8开始屏幕中的"照片"应用磁贴,Win8照片应用界面下方一般会有多个图片分类,比如常见的图片库.Skydrive.设备等,有的还会显示Facabook与Flick等.如果我们的Win8图片库中没有包含图片,也没有用微软账户登录,则所有的图片分类都没有图片显示(如下左图),点击分类进去也看不到图片.已经做了图片库包含和登录Skydrive的用户则可以在分类中看到滚动显示的图片(如下右图). 其实这三个图片分类分别对应Win8设备的图片库.Skydrive以及外接设备(如

让Win8系统照片应用显示电脑中图片

有些刚开始使用Win8的朋友也许会纳闷,为什么有些Win8设备上的照片磁贴会滚动显示不同的照片,有的却不显示;明明电脑里有很多照片,点击磁贴进入Win8照片应用之后却什么图片也看不到--这是怎么回事呢?别着急,下面我们详细说明. 我们点击Win8开始屏幕中的"照片"应用磁贴,Win8照片应用界面下方一般会有多个图片分类,比如常见的图片库.Skydrive.设备等,有的还会显示Facabook与Flick等.如果我们的Win8图片库中没有包含图片,也没有用微软账户登录,则所有的图片分类都

调试-c#读取文件图片及声音问题

问题描述 c#读取文件图片及声音问题 本人在学习c#然后找了别人做得一个项目,我运行也ok,我想模仿做一个,但有些看不懂.如下: 1.图片 这个LLK.data是个文件夹吗,然后从里面找出.bmp文件还是什么,我在自己的项目的properities/resources.resx添加了图片,又在项目里创建了data文件夹里面放入图片,结果不行,错误大概意思,缺少LLk.data.resources.然后我在别人的项目里见到了这个 请问这个文件怎么形成的呢,里面是不是有图片资源啊.还有上面图片的两行

[翻译] YLGIFImage 高效读取GIF图片

YLGIFImage 高效读取GIF图片 https://github.com/liyong03/YLGIFImage Asynchronized GIF image class and Image viewer supporting play/stop GIF images. 异步加载GIF图片的类,支持GIF图片的播放与暂停. It just use very less memory. Following GIF usually will cost almost 600MB memory i

Win8系统PE无法读取硬盘怎么解决?

Win8系统PE无法读取硬盘怎么解决?   1.重新启动电脑,在计算机开机时按住快捷键进入BIOS设置界面,下载BIOS设置界面上通过键盘方向键进行光标移动,再选择Advanced菜单,然后选择SATA Configuration,再回车; 2.在Win8系统弹出的窗口上,然后再回车后,再打开SATA Mode Section,即会出现IDE和AHCI选项,再选择IDE,然后回车.

Win8系统如何关闭自动创建图片缓存缩略图功能?

  Win8系统如何关闭自动创建图片缓存缩略图功能? 1.首先,请大家按下Windows徽标键+R键,打开运行命令框,然后输入"gpedit.msc"命令,打开组策略编辑器; 2.进入Windows组策略编辑器以后,依次双击左侧栏目的"用户配置--管理模板"选项; 3.进入Windows管理模板以后,查看子目录下的"Windows组件"文件夹,同时在该文件夹下找到"文件资源管理器"; 4.在文件资源管理器子目录选项下,找到&q

win8系统怎样使用Word设置图片透明度?

  win8系统怎样使用Word设置图片透明度?           具体方法如下: 1.首先点击"插入"选项卡的"插图"选项组中的"形状",选中矩形; 2.按住鼠标左键,进行托页,绘制矩形; 3.然后点击"形状填充"按钮,在弹出的下拉菜单中单击"图片"; 4.在弹出的"插入图片"对话框中,选中"雪景"这张图片,单击"插入"; 5.然后单击&quo

win8系统如何使用Word设置图片

  win8系统如何使用Word设置图片?有时候在编辑或采集图片的时候会对图片进行一些处理,现在网上有很多处理图片的软件,比如:PS.美图等等.如果我们希望将雪景图片设置为若隐若现的感觉,可是win8系统中没有P图软件,怎么办?难道还要下载软件吗?其实完全没必要,这个时候有Word就行啦!下面小编和大家分享win8系统使用Word设置图片透明度的方法. 具体方法如下: 1.首先点击"插入"选项卡的"插图"选项组中的"形状",选中矩形; 2.按住鼠

Win8系统写字板如何添加图片

  本教程小编和大家分享Win8系统写字板如何添加图片?win8系统自带写字板功能,写字板其实就是轻量版的word,可以编辑文字,虽然功能没有word功能那么多,但是写字板跟记事本不同的是,在写字板中还可以添加图片.那么Win8系统写字板如何添加图片,一起看看下面操作步骤. 具体方法 1.在写字板中点击插入图片按钮; 2.选择图片,点击确定,图片就插入近来了. 以上就是Win8系统写字板添加图片的全部内容了,如果只是要对有图片的文档做简单的处理,完全可以用写字板来完成.