核心图形和 GIF 颜色表

2024-02-23

我试图限制动画 GIF 的颜色数量(由一系列CGImageRef).

但是,我在实际设置自定义颜色表时遇到困难。有谁知道如何使用核心显卡来做到这一点?

我知道kCGImagePropertyGIFImageColorMap。下面是一些测试代码(大量借用这个 github 要点 https://gist.github.com/792829-- 因为这是唯一的实例kCGImagePropertyGIFImageColorMap谷歌一下就能找到)。

NSString *path = [@"~/Desktop/test.png" stringByExpandingTildeInPath];

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((CFDataRef)[NSData dataWithContentsOfFile:path]);
CGImageRef image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);

const uint8_t colorTable[ 8 ] = { 0, 0, 0, 0, 255, 255, 255 , 255};
NSData* colorTableData = [ NSData dataWithBytes: colorTable length: 8 ];
NSMutableDictionary *gifProps = [NSMutableDictionary dictionary];

[gifProps setObject:colorTableData forKey:(NSString *)kCGImagePropertyGIFImageColorMap];
[gifProps setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCGImagePropertyGIFHasGlobalColorMap];

NSDictionary* imgProps = [ NSDictionary dictionaryWithObject: gifProps 
                                                      forKey: (NSString*) kCGImagePropertyGIFDictionary ];

NSURL* destUrl = [NSURL fileURLWithPath:[@"~/Desktop/test.gif" stringByExpandingTildeInPath]];

CGImageDestinationRef dst = CGImageDestinationCreateWithURL( (CFURLRef) destUrl, kUTTypeGIF, 1, NULL );


CGImageDestinationAddImage( dst, image, imgProps );
CGImageDestinationSetProperties(dst, (CFDictionaryRef) imgProps);
CGImageDestinationFinalize( dst );
CFRelease( dst );

然而,这不会产生黑白图像。

此外,我尝试打开 GIF 来查找颜色表信息,但这几乎没有提供帮助。

CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef) destUrl, NULL);
NSDictionary *dict = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSourceRef,0, NULL);
CGImageRef img = CGImageSourceCreateImageAtIndex(imageSourceRef, 0, NULL);

printf("Color space model: %d, indexed=%d, rgb = %d\n",  CGColorSpaceGetModel(CGImageGetColorSpace(img)), kCGColorSpaceModelIndexed,kCGColorSpaceModelRGB);
NSLog(@"%@", dict);

它说 GIF 的颜色空间是 RGB。然而,如果我尝试使用索引的 PNG 代码,它会说颜色空间已索引。

此外,我尝试过的所有 GIF 都有一个图像字典,大致如下所示:

{
ColorModel = RGB;
Depth = 8;
HasAlpha = 1;
PixelHeight = 176;
PixelWidth = 314;
"{GIF}" =     {
    DelayTime = "0.1";
    UnclampedDelayTime = "0.04";
};
}

(如果我使用CGImageSourceCopyProperties(...),它提到了全局颜色图,但同样没有提供颜色表。)


我没有运行你的代码,但通过阅读它我发现一个错误: gif 中的颜色空间是rgb,所以你的颜色图应该有numcolors*3项目(而不是*4)。 IOS 不能很好地处理大小不是 3 倍数的颜色图...

换句话说:

const uint8_t colorTable[ 6 ] = { 0, 0, 0, 255, 255 , 255};
NSData* colorTableData = [ NSData dataWithBytes: colorTable length:6];

应该做这项工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心图形和 GIF 颜色表 的相关文章

随机推荐

  • Win32 更改为二进制模式子级的标准输出(管道)

    你好 这个伟大的社区 我在自动转换时遇到问题 n 0x0A to n r 0x0D 0x0A当使用管道将子级的标准输出重定向到文件时 子级的输出是字节并且not text 首先 我使用了这些例子MSDN 创建具有重定向输入和输出的子进程 h
  • 向巧克力之神发出嘘声

    Update 该实用程序用于帮助配置Git通过我正在观看的经过认证的 Microsoft Visual Academy MVA 视频 当我通过 Chocolatey 安装软件包时收到一个奇怪的错误 我已上传命令提示符 指向 Chocolat
  • spamassassin 检查分数 C# 代码

    有没有办法检查 ASP Net 应用程序中的分数 Net 的类或类似的东西 其他垃圾邮件过滤器怎么样 编辑 我正在寻找一种方法来检查 C 中电子邮件的垃圾邮件分数 这是我超级简化的 只需检查分数 代码 用于连接到我为 C 编写的正在运行的垃
  • 使用 Yammer 嵌入和开放图设置默认目标组

    我正在使用Yammer 嵌入 https developer yammer com connect 外部 Web 应用程序中的 JavaScript 控件 我想使用开放图功能 以便将所做的评论链接回创建它们的页面 这一切都非常简单 但我的问
  • 如果安装了 .Net 4.5,如何保持 .Net 4.0 行为?

    我们有一个面向 Net Framework 4 0 的 Windows 窗体应用程序 安装 Net Framework 4 5 后 应用程序开始崩溃 我们必须调查崩溃事件 并且很可能必须修复我们这边的问题 但是 在我们准备好使用 Net 4
  • 如何栅格化球体

    所以 我试图创建一个外部有 块 的球体 有点像在 Minecraft 中构建的 我不知道圆的外部的术语是什么 问题是 我不知道如何让像中点圆算法这样的方程适用于球体 最好是在 lua 或 java 中 这样我可以更轻松地阅读任何答案 我不想
  • @with_kw 在 Julia 中做什么?

    我正在阅读一些代码 如下所示 with kw struct HyperParams batch size Int 128 latent dim Int 100 epochs Int 25 verbose freq Int 1000 outp
  • TypeError:在 Xubuntu 14.04.5 上尝试 Selenium 时,urlopen() 获得了关键字参数“body”的多个值

    环境 lsb release a No LSB modules are available Distributor ID Ubuntu Description Ubuntu 14 04 5 LTS Release 14 04 Codenam
  • java中可以将字符串转换为数学运算吗?

    我可以将像 3 3 3 这样的字符串转换为java中的数学运算吗 使用 JavaScript 来评估它脚本引擎 http docs oracle com javase 6 docs api javax script ScriptEngine
  • AWS Lex Python Codehook 参考

    我对 Python 和编码 还很陌生 但我正在尝试使用 Lambda 函数构建自己的 Lex 机器人 我一直在关注教程 我可以理解它是如何工作的 问题是 当我尝试为 Lex 编写自己的 Lambda 函数时 我找不到任何参考来帮助我编写代码
  • 将带逗号的字符串转换为数组

    如何将字符串转换为 JavaScript 数组 看代码 var string 0 1 var array string alert array 0 在这种情况下alert shows 0 1 如果它是一个数组 它会显示0 而如果alert
  • 使用 .net SDK 从 Amazon S3 存储桶下载文件夹

    如何使用 net sdk 下载 s3 存储桶中存在的整个文件夹 尝试使用以下代码 它会抛出无效密钥 我需要下载存储桶中存在的嵌套 pesudo 文件夹中存在的所有文件 并将文件下载限制删除为默认值 1000 public static vo
  • 如何在Retrofit-2.0+ android中设置超时

    我提到这个链接 https stackoverflow com a 29380845 1083093但我似乎无法实现我的 我在用 compile com squareup retrofit2 retrofit 2 0 2 compile c
  • 将 Drupal 用户帐户导入 Rails,无需用户更改密码

    我想将一系列 Drupal 用户帐户导入到new铁轨项目 我正在使用 Devise 在 Rails 中进行用户身份验证 我希望能够将加密密码从 Drupal 导入到 Rails 中 以便用户在网站迁移时获得无缝体验 关于如何做到这一点有什么
  • 为什么 git revert 在这些情况下表现不同?

    假设我有ProjectA and ProjectB其中我只有一个名为test txt在这两个项目中并使用 git 跟踪它 第一次提交后 两个项目中的文件内容如下所示 one two three four 第二次提交后 两个项目中的文件内容如
  • dompdf:A4页面上的白边距

    我正在使用 dompdf 一个 PHP 库 创建 PDF 页面 但在设置正确的尺寸时遇到问题 当我使用 CSS 属性时 page size 21cm 29 7cm 例如 我想要页面的上半部分为红色 PDF 文件没问题 但打印后我得到了白色边
  • 如果我更改操作系统时区,事件(作为 json feed)、开始结束参数 unix 时间戳会有所不同

    我正在使用 fullcalendar 插件 如果有人可以帮助我 我将不胜感激 我通过 PHP URL 获取 json 事件 像这样的东西 calendar fullCalendar events myfeed php 因此 在返回事件的 p
  • Springboard 无法启动应用程序,错误为 3、0、4 等

    为什么 Xcode 无法在模拟器中启动应用程序 我在网上浏览了很多解决方案 但有时有效 有时无效 很多时候我解决问题的方法就是退出模拟器 删除应用程序 重置模拟器的内容设置 并清理和构建 但为什么我每次都要尝试其中的任何一个 所有 呢 Xc
  • 从命令行启动 Beyond Compare

    我已安装 Beyond Compare 3 C Program Files Beyond Compare 3 BCompare exe 和西格温 C Cygwin bin bash exe 我想要的是能够使用诸如以下的命令 diff
  • 核心图形和 GIF 颜色表

    我试图限制动画 GIF 的颜色数量 由一系列CGImageRef 但是 我在实际设置自定义颜色表时遇到困难 有谁知道如何使用核心显卡来做到这一点 我知道kCGImagePropertyGIFImageColorMap 下面是一些测试代码 大