近期,我的新作品「HEIF & HEVC 转换器」已在 App Store 发布。这款 App 能够将 iPhone、iPad、Mac 相册中的照片和视频,转换为更高效的 HEIF/HEVC 格式,在尽可能减少画质损失的情况下,节省存储空间。
为庆祝 App 上架,在文章末尾,我将提供 20 个 App 兑换码。欢迎兑换并下载体验。
开发背景
2017 年发布的 iOS 11,增加了对 HEIF 和 HEVC 格式的支持,这两种新格式具有更高的压缩率,占用存储空间较少。新拍摄的照片和视频,默认都会保存为 HEIF 和 HEVC 格式。
我的 iOS 相册中,几乎保存了自己的所有照片,包括 2017 年之前拍摄的照片、其他人分享给我的照片,还有使用 Google 照片扫描仪扫描的老照片。这些照片大多是 JPEG 格式。
iOS 11 发布后,我一直想将这些照片转换为 HEIF 格式,减少空间占用,但一直没有找到合适的工具。所以我打算开发一款工具,实现这样的功能,但是一直没有开始动手。
由于 AI 编程工具的逐步普及,我觉得在 AI 的帮助下,自己能够更快地实现想要的功能。于是,我开始使用 Alex 等编程工具,进行了此项目的开发。
功能与特色
- 支持批量转换整个照片图库,也可手动选择指定照片和视频进行处理
- 兼容实况照片(Live Photo):图片部分转换为 HEIF 格式,视频部分转换为 HEVC 格式
- 尽可能多地保留照片元数据,包括位置信息、收藏状态等
- 转换后的照片,仍会放在原始相册,无需重新整理
- 全程在本地转换,不联网,不泄漏隐私
转换效果
在默认设置下(JPEG 图片质量为 90%,PNG 图片质量为无损,视频质量为「高质量」),我尝试转换了照片库中的一部分照片和视频,共 20GB。转换后节省了 6.25GB 的空间:
查看具体的统计信息,可以看到 PNG 图片(一般是截图)的压缩率最好:953.1MB 的图片,压缩后只剩下 97.3MB。JPEG 照片也有着不错的压缩率,节省了接近一半的空间。对于视频,节省的空间较小,原来 7.12GB 的视频,压缩后还有 6.76GB:
经过分析,在默认配置下,部分视频转换后会变小,部分视频转换后会变得更大,整体看还是能节省空间的。在当前版本中,我已经对 Live Photo 的视频部分进行了优化,如果转换后的大小大于原视频,则只转换照片部分,视频部分仍使用原始视频。后续版本,我将提供一个选项,用户可以选择是否保留转换后变得更大的视频。
提示与技巧
- 如果照片视频较多,想要分批转换,可以在转换一部分媒体后,直接点「取消转换」;已经转换的媒体仍可以保存到照片图库;
- 如果转换过程锁屏、关机,或任务切换,导致此 App 被杀后台,已转换的媒体不会丢失;只需重新打开 App,按照提示保存已转换媒体即可;
- 除了 iPhone 和 iPad,此 App 还支持 Apple Silicon Mac。在 Mac 上转换性能更好,而且 App 能长时间在保持在后台运行,持续转换;
- 推荐搭配 CleanMy®Phone、ByePhotos 等 App,以及 iOS 相册中的「合并重复项目」功能使用。这些工具可以清理重复照片、模糊照片、屏幕截图等,而且能调整视频的分辨率和质量,进一步释放存储空间;
- ⚠️ 转换完成后,原始媒体将被删除。为了确保数据安全,使用前请先完整备份照片图库。
由于照片和视频的转换,涉及较多细节处理。开发者不能保证所有媒体都能成功转换。如果发现有无法转换的媒体,或者转换后出现色彩错误等问题,请与我邮件反馈(feedback at blanboom.org
),并在邮件中附上有问题的照片或视频。
关于 AI 编程
先说结论:App 超过 90% 的代码都来自 AI,但开发过程并没有想象中简单
先说结论,「HEIF & HEVC 转换器」的共有 21 个 swift 文件,5808 行代码,其中 90% 以上的代码都是 AI 生成的。包括 App 的图标,也是 AI 创作的。
blanboom@blanboom-studio ~/W/ConvertToHEIFHEVC (develop)> cloc .
43 text files.
34 unique files.
53 files ignored.
github.com/AlDanial/cloc v 2.04 T=0.03 s (1274.5 files/s, 285252.9 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Swift 21 954 416 5808
JSON 5 0 0 156
Markdown 3 18 0 144
XML 5 0 0 114
-------------------------------------------------------------------------------
SUM: 34 972 416 6222
-------------------------------------------------------------------------------
但是,开发 App 的过程,并没有像《我用 Cursor 半小时制作了一个网站》、《我用 Cursor 两小时开发了一个 App》之类的文章所说的那样简单。目前的 AI 辅助编程工具,还无法做到提一个需求,就生成一个复杂的 App。
我需要将需求细分成小的功能点,让 AI 针对单一功能点生成代码,解决编译错误,运行和调试,然后继续下一个功能点的开发。
回顾了一下 git log,从 2024 年 12 月首次提交代码,到 App 发布,一共花了四个月的时间。我主要利用每周末的空闲时间进行开发,每周大约投入四小时左右。
Cursor 与 Windsurf 初体验
最初体会到 AI 辅助编程的便利,是在为 AirTerminal 增加 Telnet 服务器功能 时、的时候。当时我还没有使用专门的 AI 编程工具,只是通过与 ChatGPT 的几轮对话,就成功实现了功能,包括界面和具体逻辑。
在开发「HEIF & HEVC 转换器」初期,我尝试了 Cursor 和 Windsurf。两款工具的体验基本类似,由于 Windsurf 更便宜,我选择了为 Windsurf 付费,并顺利完成了 App 最初的照片转换功能。
但随着项目复杂度增加,这两款工具为了节省上下文长度,经常只给 AI 提供代码的一小部分,而非完整文件,导致生成的代码频繁出现问题和编译错误。
改用 Alex
后来,我了解到 Alex,这款工具可以直接集成到 Xcode 中,避免了频繁在 Xcode 和其他编辑器之间来回切换的麻烦,更重要的是,Alex 会尽可能向 AI 提供完整的源文件,使得生成代码的编译通过率和实际可用性都明显提高。
期间,我也试用了 Cline 和 Roo Code,它们虽然也能提供完整的文件上下文,但必须使用自己的 API Key,按使用量付费,长期使用成本较高。我在配合 OpenRouter 上的 Claude 3.5 Sonnet API 使用一晚上后,就发现已经用掉了 10 美元。即使切换到更便宜的 DeepSeek V3,仍会花费较多费用。
此外 Cline 和 Roo Code 具有更高级的自动化功能,例如执行终端命令,获取 Git 的 commit 日志,或者自动编译并修复编译错误等。但实际体验发现,如果完全放任 AI 自动操作,不进行人工干预,修改后的代码往往会偏离最初的需求。
因此,我最终还是选择了与 Xcode 集成更紧密的 Alex。
使用 AI 编程的经验
在使用 Cursor 等 AI 编程工具,从零开始开发一个新项目时,我相信大部分人都会和我一样,都会惊叹于 AI 编程带来的神奇体验:只需简单几轮对话,就能生成一个可用的 demo,并成功运行。这很容易让人产生一种错误:AI 编程原来如此轻松。
然而,当项目复杂度逐渐提升,这种轻松感就会慢慢消退。此时,我开始尝试一些额外的技巧,让 AI 持续稳定地辅助自己编程:
- 首先,我需要对功能点继续细分,让 AI 更准确地理解需求,一次只完成一个小功能。有时候我想偷一下懒,一次让 AI 完成两三个功能,生成的代码往往就不能很好地工作了;
- 当一个文件变大后,我开始尝试对文件进行拆分,避免单个文件过大;
- 项目文件变多后,我开始为项目增加
.cursorrules
、.windsurfrules
、.clinerules
等文件,在其中描述项目的代码结构,和每个文件的功能。这有助于让 AI 更容易找到需要的文件。
当项目变得更加复杂,即使用了上述技巧,并从 Windsurf 换成 Cursor,AI 也不能很好地工作了。这时候,我需要进一步熟悉和理解项目代码结构,在提问时,找出关键代码并进行解释。通过这样的方式,AI 仍然可以逐步实现自己需要的功能。
在项目调试和解决复杂问题时,我经常使用的一种方法,是让 AI 生成详细的日志,再将运行结果和日志反馈给 AI。反复几轮对话后,一般都能成功解决问题。
对于模型的选择,我优先使用的是 Claude 3.5 Sonnet,在编程方面有着不错的效果。后来推出的的 Claude 3.7 Sonnet 整体用下来,没有 3.5 效果好,但更适合进行图形化界面方面的任务。所以在项目后期,我主要用 Claude 3.7 Sonnet 优化界面。
总结与个人感受
目前我从事网络协议方面的开发,主要使用 C 语言开发 Linux Kernel 中的网络协议栈,以及在 Linux 用户态实现路由协议。所以完成这个 App 的过程,完全无法用到自己的工作经验。
我的 iOS 开发知识,主要来自 Stanford CS193p iOS 开发公开课,以及开发 HackerRemote 和 AirTerminal 这两个简单 App 时的一些积累。整体上讲,我对 iOS 开发谈不上熟练。
这些 AI 编程工具,并没有让我实现「提出需求、自动制作完整的 App」。但是,它们却能让我这个非专业 iOS 开发者降低开发一款新 App 的心理压力,并立刻行动起来,利用自己的有限时间,将想法一步步变为现实。
兑换码
- M6YMFPF67L36
- TFJ3AJANFAXJ
- 46P4FFANP3ME
- RP9RWRAAMKE3
- LJETHTNYTWLH
- NF7YWMEY9YT3
- F3P9KXNATWPJ
- A3NLY4EYFALX
- WH4RJJ993XKR
- AXW7F7T67XLA
- X33JNRLALH3J
- F96X7J79N6XM
- LKHJNM4YYFWY
- H6JW7WT64YJE
- RN3HY9YJX4Y7
- 6RLJPMRXM4XR
- 6K4X4AL4JL37
- KRYLH9FXKTFF
- 4K7AY4KRY7KM
- JMX3WMM439FP
可在浏览器中打开此链接,输入兑换码进行兑换: