保存为GIF后图像质量下降

时间:2016-12-20 17:30:27

标签: ios swift image-processing gif

我正在开发一个iOS应用程序,允许用户拍摄一系列照片 - 然后将照片放入动画中并导出为MP4和GIF。

虽然MP4呈现源质量,但GIF颜色等级可见。

这里是视觉比较:

GIF:GIF

MP4 MP4

我用于导出为GIF的代码:

IO

我用于导出为MP4的代码:

var dictFile = new NSMutableDictionary();
        var gifDictionaryFile = new NSMutableDictionary();
        gifDictionaryFile.Add(ImageIO.CGImageProperties.GIFLoopCount, NSNumber.FromFloat(0));

        dictFile.Add(ImageIO.CGImageProperties.GIFDictionary, gifDictionaryFile);

        var dictFrame = new NSMutableDictionary();
        var gifDictionaryFrame = new NSMutableDictionary();
        gifDictionaryFrame.Add(ImageIO.CGImageProperties.GIFDelayTime, NSNumber.FromFloat(0f));

        dictFrame.Add(ImageIO.CGImageProperties.GIFDictionary, gifDictionaryFrame);


        InvokeOnMainThread(() =>
    {
        var imageDestination = CGImageDestination.Create(fileURL, MobileCoreServices.UTType.GIF, _images.Length);

        imageDestination.SetProperties(dictFile);

        for (int i = 0; i < this._images.Length; i++)
        {
            imageDestination.AddImage(this._images[i].CGImage, dictFrame);

        }
        imageDestination.Close();
    });

感谢您的帮助!

亲切的问候,

安德烈

1 个答案:

答案 0 :(得分:2)

这只是对我的评论的总结......

我不在您的平台上编码,所以我只提供通用答案(以及我自己 GIF 编码器/解码器编码经验的见解)。

GIF 图片格式支持每像素高达8位,每个像素最多可显示256种颜色,并采用天真编码。便宜的编码器只是将输入图像截断为256或更少的颜色,通常会导致难看的像素化结果。为了提高 GIF 的着色质量,我知道有三种方法:

  1. 使用自己的调色板覆盖屏幕的多个框架

    只需将图像划分为叠加层,每个叠层层都有自己的调色板。这很慢(因为您需要处理每个单个图像的更多帧,这可能会导致某些观看者出现同步错误,并且您需要每个图像多次处理所有与帧相关的块)。编码本身很快,因为您只需将基于颜色或区域/位置的帧分离为多个帧。这里(基于地区/位置)示例:

    multiple palettes

    示例图片来自此处:Wiki

    GIF 支持透明度,因此子帧可以重叠... 这种方法可以将每像素的颜色物理增加到N*256 (或{{1对于透明帧)其中N*255是每个图像使用的帧数或调色板数。

  2. <强>抖动

    抖动是指仅使用指定颜色(来自调色板)时尽可能接近颜色的区域颜色的技术。这是快速且易于实现的,但结果有点嘈杂。有关更多信息,请参阅我的一些相关答案:

  3. 更好的色彩量化方法

    便宜的编码器只是将颜色截断为预定义的调色板。通过基于直方图聚类使用的颜色可以获得更好的结果。例如,见:

    结果通常比抖动好得多,但与抖动相比编码时间很长......

  4. #1 #3 可以一起使用,以提高质量......

    如果您无法访问编码代码或管道,您仍然可以在编码之前对图像本身进行变换,然后将结果直接加载到 GIF 编码器(这应该是可能的)(如果你使用的 GIF 编码器至少有点复杂......)

相关问题