拾映即将上架 App Store,现在还没有上架。用照片做出点东西,要的是结果和你想的一样:实况照片真的是实况,编辑存下来的就是你看到的,分享出去顺顺当当。下面是拾映拼图、编辑器和分享背后的细节,先说做了什么,再说为什么这样做。App 的其他部分见拾映的细节。
存一张会动的拼图,会发生什么?
拼图里有实况照片时,拼出来的图可以动;而存好之后它还是一张真正的实况,比听上去要难。
导出面板有三档,实况那一档的小字会告诉你它怎么动
做法: 拼图里有实况照片时,导出面板有三档:实况照片、一段视频、静态图片。实况照片那一档下面的小字,跟着拼图的动法变:一起动写「长按会动起来」,接力动写「长按会依次动起来,带声音」,聚焦写「长按会放大主角,播完回到拼图」。
为什么这样做: 接力动和聚焦在长按时的表现不一样,小字就是为了不让你拿到成品之后才发现。
拼图可以带实况:存进相册,就是一张实况照片
做法: 拼图里有实况照片时,可以导出成实况照片:一张静图加一段视频,用同一个配对号连在一起;两样东西在同一次保存请求里交给照片图库,所以只要通过下一张卡片说的验证,图库里存下来的就是实况照片。
为什么这样做: 实况照片是两个文件,靠那个配对号才算一对。拾映宁可退成普通静图,也不留下一张看着保存成功、其实不是实况的拼图。
存或分享之前,先验一次这对文件是不是真的实况
做法: 保存或分享之前,拾映会请 iOS 把静图和视频重新装成一张实况照片。iOS 认了这一对,才按实况交付。
为什么这样做: 装不回来还硬发,对方收到的是一张图加一段看着毫不相干的视频,比只发一张静态海报更糟。
验不过,就存成普通静图,不留假实况
做法: 这一对文件验不过时,拾映会把静图里的配对号摘掉、删掉配对视频,只存一张普通静图。如果配对号摘不掉,就报错,不存假实况。
为什么这样做: 带着配对号的图,会被系统当成只有一半的实况,另一半永远不存在。剩下只有“落一张假实况”和“报错”两条路,拾映选报错。
拼图里一张实况都没有时,动态那几档自动变静图
做法: 拼图里没有实况照片时,要求导出实况照片或一段视频,也会按静图导出。
为什么这样做: 没有可动的素材,视频合成就没法进行。退成静图,把一次会失败的导出变成一次正常的导出。
某一张实况的动态读不出来,只有那一格是静的
做法: 拼图里某一张照片的配对视频取不到时,只有那一格用静图,其余格子照常动;全都取不到时,整张拼图会变成静图。
为什么这样做: 少了一段,不该让其余格子的动态跟着白白丢掉。一段都没有时,就没有可动的东西了,整张才退一步。
选「一段视频」导出的是 mp4,不冒充实况
做法: 「一段视频」导出的是 mp4,没有配对号,iOS 不会把它当成半张实况。「我的创作」里只留这件作品的海报静图;视频本身去哪里,由你当下选的去向决定,存进相册,或者分享出去。
为什么这样做: 「我的创作」把带配对视频的条目当成可以长按播放的实况。把一段 mp4 放进去,失败会发生在你点开它的那一刻,离出错的地方很远。
“没能生成”和“已损坏”,说的是两句不同的话
做法: 实况装不起来时,超时和“这一对对不上”会给出不同的提示。超时写「这次没能生成实况」和「实况准备超时了,稍后再试。」;对不上写「无法生成这张实况」和「这件作品的实况对子已经损坏,只能当静态图片用了。」拼图最多等 45 秒;分享截图海报默认等 8 秒。
为什么这样做: 以前一次超时被说成作品坏了,你以为作品毁了,其实再点一下就好。45 秒也不是要一直等下去:你关掉面板、或后台时间用完,会立刻停下。这个数只是为了不把一张本来装得出来的实况判死。
存好的拼图去了哪里?保存被打断会怎样?
下面是保存拼图的过程中发生的事。
所有拼图都进同一个相册:拾映创作
做法: 实况、视频、静图三种拼图,都存进同一个相册「拾映创作」,也会出现在「我的创作」里。它们不继承源照片所在的相册,位置信息留空。分享时也会先存一份到这里;如果这一步存不进去,分享照样继续。
为什么这样做: 拼图由好几张照片合成,没有唯一的位置,留空才是对的。这个相册给拼图一个自己的家,「我的创作」也就能在里面找到它们。
点「存入相册」就能走,做完会提醒你
做法: 点了「存入相册」就可以关掉编辑器。导出在 App 里跑,不属于哪一页;切到别的 App,它会用 iOS 给的一小段后台时间接着做。你离开至少 30 秒、而且允许了通知,做完(或失败)时会收到一条通知。拾映不会借这个机会向你要通知权限。
为什么这样做: 点完保存马上切走,和点完等了 20 秒才切走,是两种情形,所以 30 秒是从你离开 App 那一刻算起的。刚瞄一眼别的 App 就来一条通知,只是打扰;这样的通知多了,你可能干脆关掉通知,那样连每日回顾提醒也一起没了。
同一时间只跑一个保存,连点两下也只跑一次
做法: 同一时间只会跑一个拼图保存。同一批照片、同样的设置,再点「存入相册」,也只跑一次。
为什么这样做: 一次导出要取十几张原图,再逐帧合成,两个一起跑会抢内存和视频编码器。
有一张照片取不到,那一格画成灰色,其余照常导出
做法: 某张原图取不到,比如还没从 iCloud 下载下来,那一格会画成中性灰,其余部分照常导出。一张都取不到时,导出会失败。拾映先按拼图需要的尺寸去取这张照片,这可能要从 iCloud 取;取不到,再试一次,只问手机上已有的,3 秒没有进展就放弃。
为什么这样做: 一格灰色,远好过整张拼图没了。一张都画不出来,确实没有成品可言。
超长图一格一格地画,不是一次全摊开
做法: 超长图拼图不会一次把所有照片解出来,而是一格一格取、画完就放。
为什么这样做: 在一次内部测量中,同一份测试素材,一次全摊开的内存峰值是 365 MB,分段画是 12 MB。
导出的视频码率不低于 12 Mbps,画布越大越高
做法: 拼图视频的码率按像素数换算:1080 × 1440 的画布是 12 Mbps,最低不会低于这个数,最高不超过 64 Mbps。
为什么这样做: 画布变大时,每个像素分到的数据量保持不变,大拼图就不会比小拼图看起来更“单薄”。上限用来控制文件大小和编码器的负担。
回顾结束后递上的拼图,实况照片的视频必须已经在手机里
做法: 一轮回顾结束后,拾映可能会提议用你刚看过的照片拼一张图。实况照片要入选,它的视频部分必须已经在 iPhone 上。拾映不联网判断这一点;10 秒内判不出来,就算不在手机上。
为什么这样做: 开了「优化 iPhone 储存空间」,静图在手机里、视频还在 iCloud 是常有的事。不查这一步,递上的拼图里那张实况长按不会动,播放还会转 15 秒才放弃。从 iCloud 取原图,留给你在编辑器里自己发起。
编辑器怎么对待实况、滤镜和你的原片?
编辑会改动你的照片,所以编辑器对“覆盖什么、告诉你什么”很小心。
给实况加边框,保存出来就是静图
做法: 实况照片加了边框,保存结果一律是静图,不再是实况。原片仍在你的图库里,还原原片,实况就回来了。
为什么这样做: 边框会让静图变大,视频每一帧却还按原来的大小画,长按时视频就会被裁掉、缩在一角,或者露出杂色;竖拍的实况,视频是横着存的,更麻烦。这在真机上连着试了好几版都没绕过去,最后定成一条规则。
挑实况里的任意一刻,带着你的调整存成照片
做法: 在编辑器的实况页里,拖到想要的那一帧,点「存为照片」,图库里会多一张独立的照片,当前的调整一起带上,原来的实况保持不变。「设为主要照片」就在同一条胶片带的下面。
为什么这样做: 你按按钮时,看的就是屏幕上那个样子,所以存出来的这一帧带着同样的裁剪和调色。这一帧由保存实况时处理每一帧的同一个函数渲染,“先看后存”和“直接存”不会给出两张不同的图。
最近用过的滤镜提到前面,不在原来的分类里重复出现
做法: 滤镜带上,原片之后是你最近用过的几个滤镜(用过才有)。它们会从原来的分类里搬走,同一个滤镜在带子上只出现一次。顺序在你进入页面时定好,点滤镜的时候不会重新排。
为什么这样做: 同一个滤镜出现两次,你会想“怎么又是它”。边点边重排也不好,手指底下那一格会当场跑掉。最小的一族也有 6 个滤镜,不会有哪一族被搬空。
你自己的滤镜,没存过也有位置
做法: 「自定义滤镜」这一段一直在滤镜带上,哪怕一个都没存过。段尾是「存为滤镜」,存好的滤镜就放在这一段里。
为什么这样做: 存滤镜的入口就在这一段里。这一段空了就消失的话,你第一次想存,就没有地方可存。
拖滑杆的时候,预览跟得上手指
做法: 拖动滑杆或拉直照片时,预览一次只渲染一张,中间的值直接丢掉;一张渲完,马上接着渲最新的那个值。所以画面会跟着手指走,松手后会停在最新的那个值上。
为什么这样做: 在改进之前的一次 iPhone 上的内部测量里,拖一下用了 211–623 毫秒,发出 7 到 21 次预览请求,真正渲染的只有 0 到 2 次,因为每一次请求都被下一次取消了。结果就是拖着的时候画面不动、松手才变,而渲染一张其实只要 1–73 毫秒。
HDR 保不住时,先问你,再存成 SDR
做法: 保存照片时,如果它的 HDR 那一层保不住,拾映不会悄悄存成普通的 SDR,而是先停下来问你,你同意了才存成 SDR。HDR 能保住的时候,什么都不会问你。
为什么这样做: 以前可能出现悄悄降级:一张带 HDR 层的照片只是旋转或裁剪了一下,存出来却变成 SDR,界面还说“已保存”。反过来,保不住就拒绝保存也不对,因为你想编辑 HDR 照片。有代价的降级,应该先让你确认。
编辑覆盖照片之前,先确认拿到的是全尺寸原件
做法: 保存编辑,是把新的像素写回图库里的这张照片。写之前,拾映会确认 iOS 交回来的是全尺寸原件,不是一份小的替身。拿不准,就不写。
为什么这样做: 保存编辑是把新像素写回已有照片的那条路,以前并没有一道关卡问过交回来的这份够不够大。说不清的时候,什么都不写,比写错安全。
分享、格式副本和快捷指令,怎么和 iOS 的其他部分配合?
这几处,是拾映和分享菜单、快捷指令、你的照片图库打交道的地方。
分享实况拼图时,「隔空投送」仍然在
做法: 分享一张实况照片时,分享面板只交给 iOS 一件东西,所以「隔空投送」会出现在目标里。隔空投送收到的是静图文件;信息等其他目标收到的是实况照片本身。如果这一对文件没有装成实况,所有目标收到的都是静图。
为什么这样做: 曾经有人测出“点分享没有隔空投送”。原因是隔空投送只处理文件,而实况照片对象不是文件。后来试过交两个文件,让对方的照片 App 合回实况,但分享面板里会多出两件东西,而且“对面会自动合成”这件事从没在两台 iPhone 之间验证过,所以撤掉了。
分享出去的实况海报,是你编辑后的样子
做法: 分享一张实况照片的海报,比如截图后分享,海报里是你正在看的这个版本,带着你的编辑,不是没编辑过的原片。如果做不出实况版,你拿到的仍是一张普通的静态海报。
为什么这样做: iOS 可以交回“原片加一份调整说明、让你自己重放”,也可以交回“已经烘焙好的成品”。拾映要的是成品,因为重放说明会导出一张没编辑过的实况,和你屏幕上的卡片对不上。
格式转换会另存一份副本进「拾映转换」,原照片不动
做法: 照片换格式、视频转实况、视频转 GIF,都会生成一份新副本,原件不动。副本放进「拾映转换」相册,并尽量带走拍摄日期、位置、收藏、原来所在的相册和拾映标签。
为什么这样做: 这三种转换共用同一个“把副本写进图库”的出口。视频转实况和视频转 GIF 各写过自己的一份时,漏掉的恰好是最容易漏的:相册归属、“登记新副本”这一步、成功后“进入转换文件夹”的横幅,而且都不报错,成品只是静静地落在错的地方。收成一条路,这类事就不容易再出现。
在快捷指令里,拾映的动作叫「拾映」,不叫「打开」
做法: 在快捷指令 App 里,拾映的动作、新建快捷指令时的默认名字、搜索框匹配的名字,都是「拾映」,「打开」只是参数的名字,所以一行读作「拾映 · 打开:那年今日」。搜“照片”“回顾”“相册”也能找到它。
为什么这样做: 以前动作叫“打开”,用默认名字存下来的快捷指令就叫“打开”,混在几十条里认不出是谁的,搜 App 的名字也搜不到。多补的搜索词,是你最可能先想到的那几个。
快捷指令只能打开页面,碰不到具体的哪一张照片
做法: 拾映开放给快捷指令的动作,只负责打开某个页面,共 12 个目的地,包括那年今日、随机回顾、我的旅程、拼图、做成卡片、我的创作、编辑照片等。会动到具体某一张照片的动作,比如“留下这一张”“放到一边”,只存在于小组件上。
为什么这样做: 那些动作需要小组件手里那份“它当时显示的是哪一张”的凭据。快捷指令打开的页面,都是让你自己去选照片,所以快捷指令不会把某张照片的身份带进 App。
分享菜单里的「压缩」「拼图」「转实况」,只负责打开拾映
做法: 压缩、拼图、转实况,会作为一行出现在系统分享菜单里。选 2 到 30 张照片时有拼图,选一段视频时有转实况。点这一行,分享菜单里不处理任何东西:面板收起,拾映打开。
为什么这样做: 真正的处理在拾映里完成,那里你看得见,也能接着往下做。扩展的界面是透明的,所以你看到的只是分享面板收起、拾映打开。
接着看
拾映还没上架,想在上架时收到邮件吗?