如何使 xamarin.ios 中生成的 gif 变慢?

How to make Generated gif in xamarin.ios slower?

我在我的 xamarin.forms 项目中创建了一个服务,用于从四个下载的帧生成一个 gif。 android 端运行良好,但我在 iOs 端遇到问题,创建 gif 但速度太快,无论设置的延迟值如何。这是我的class:

public class GifService : IGifService
{
    public string CreateGif(string frame1Path, string frame2Path, string frame3Path, string frame4Path,string webId,string path="")
    {
        List<UIImage> listOfFrame = new List<UIImage>();

        UIImage image1 = new UIImage(frame1Path);

        listOfFrame.Add(image1);

        UIImage image2 = new UIImage(frame2Path);

        listOfFrame.Add(image2);

        UIImage image3 = new UIImage(frame3Path);

        listOfFrame.Add(image3);

        UIImage image4 = new UIImage(frame4Path);

        listOfFrame.Add(image4);

        NSMutableDictionary fileProperties = new NSMutableDictionary();
        fileProperties.Add(CGImageProperties.GIFLoopCount, new NSNumber(0));

        NSMutableDictionary frameProperties = new NSMutableDictionary();
        frameProperties.Add(CGImageProperties.GIFDelayTime, new NSNumber(5f));

        NSUrl documentsDirectoryUrl = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User,null, true,out _);
        NSUrl fileUrl = documentsDirectoryUrl.Append(webId + ".gif",false);

        var destination = CGImageDestination.Create(fileUrl, MobileCoreServices.UTType.GIF, 4);
        destination.SetProperties(fileProperties);

        foreach(var frame in listOfFrame)
        {
            var cgImage = frame.CGImage;
            if(cgImage!= null)
            {
                destination.AddImage(cgImage, frameProperties);
            }
        }

        if (!destination.Close())
        {
            Console.WriteLine("Failed to finalize the image destination");
        }
        return fileUrl.Path;
    }
}

我认为问题是 CGImageProperties.GIFDelayTime 被忽略了,但我不知道为什么。我该如何解决这个问题?

经过一些尝试,我终于找到了生成具有所需延迟的 gif 的解决方案。我不知道为什么,但按照我在问题中展示的方式,选项被忽略了。 这是一个可行的解决方案:

public class GifService : IGifService
{
    public string CreateGif(string frame1Path, string frame2Path, string frame3Path, string frame4Path,string webId,string path="")
    {
        List<UIImage> listOfFrame = new List<UIImage>();

        UIImage image1 = new UIImage(frame1Path);

        listOfFrame.Add(image1);

        UIImage image2 = new UIImage(frame2Path);

        listOfFrame.Add(image2);

        UIImage image3 = new UIImage(frame3Path);

        listOfFrame.Add(image3);

        UIImage image4 = new UIImage(frame4Path);

        listOfFrame.Add(image4);

        NSMutableDictionary fileProperties = new NSMutableDictionary
        {
            { CGImageProperties.GIFLoopCount, new NSNumber(1) }
        };

        NSUrl documentsDirectoryUrl = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User,null, true,out _);
        NSUrl fileUrl = documentsDirectoryUrl.Append(webId + ".gif",false);

        var destination = CGImageDestination.Create(fileUrl, MobileCoreServices.UTType.GIF, 4);
        destination.SetProperties(fileProperties);

        foreach (var frame in listOfFrame)
        {
            //difference is here, i create a var option and i set the 
            //GifDictionary
            var options = new CGImageDestinationOptions();
            options.GifDictionary = new NSMutableDictionary();
            options.GifDictionary[CGImageProperties.GIFDelayTime] = new NSNumber(1f);
            var cgImage = frame.CGImage;
            if(cgImage!= null)
            {
                destination.AddImage(cgImage, options);
            }
        }

        if (!destination.Close())
        {
            Console.WriteLine("Failed to finalize the image destination");
        }
        return fileUrl.Path;
    }
}