我正在开发一个iOS应用程序,允许用户拍摄一系列照片 - 然后将照片放入动画中并导出为MP4和GIF。
虽然MP4呈现源质量,但GIF颜色等级可见。
这里是视觉比较:
GIF:
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();
});
感谢您的帮助!
亲切的问候,
安德烈
答案 0 :(得分:2)
这只是对我的评论的总结......
我不在您的平台上编码,所以我只提供通用答案(以及我自己 GIF 编码器/解码器编码经验的见解)。
GIF 图片格式支持每像素高达8位,每个像素最多可显示256种颜色,并采用天真编码。便宜的编码器只是将输入图像截断为256或更少的颜色,通常会导致难看的像素化结果。为了提高 GIF 的着色质量,我知道有三种方法:
使用自己的调色板覆盖屏幕的多个框架
只需将图像划分为叠加层,每个叠层层都有自己的调色板。这很慢(因为您需要处理每个单个图像的更多帧,这可能会导致某些观看者出现同步错误,并且您需要每个图像多次处理所有与帧相关的块)。编码本身很快,因为您只需将基于颜色或区域/位置的帧分离为多个帧。这里(基于地区/位置)示例:
示例图片来自此处:Wiki
GIF 支持透明度,因此子帧可以重叠... 这种方法可以将每像素的颜色物理增加到N*256
(或{{1对于透明帧)其中N*255
是每个图像使用的帧数或调色板数。
<强>抖动强>
抖动是指仅使用指定颜色(来自调色板)时尽可能接近颜色的区域颜色的技术。这是快速且易于实现的,但结果有点嘈杂。有关更多信息,请参阅我的一些相关答案:
更好的色彩量化方法
便宜的编码器只是将颜色截断为预定义的调色板。通过基于直方图聚类使用的颜色可以获得更好的结果。例如,见:
结果通常比抖动好得多,但与抖动相比编码时间很长......
#1 和#3 可以一起使用,以提高质量......
如果您无法访问编码代码或管道,您仍然可以在编码之前对图像本身进行变换,然后将结果直接加载到 GIF 编码器(这应该是可能的)(如果你使用的 GIF 编码器至少有点复杂......)