我已经在两个周末里一直在浏览Apple Photos macOS应用程序,但我陷入了困境。我希望StackOverflow的聪明人可以解决这个问题。
我不知道的是:
如何确定新的十六进制目录,以及它们与RK.modelId的对应关系。也许是RKFace.ModelId的16 mod或RKFace.ModelId的mod 256?
一段时间后,小平面十六进制值不再对应于RKFace.ModelId。例如,RKFace.modelId 61047应该是facetile_ee77.jpeg。但是,正确的facetile是face / 20/01 / facetile_1209b.jpeg。十六进制值1209b是dec值73883,对此我没有RKFace.ModelId。
我知道的事情:
Apple Photos利用深度学习网络来检测和裁剪导入照片中的面孔。它将这些检测到的面部裁剪的jpeg保存到资源/媒体/面部/00/00/facetile_1.jpeg中的照片库中。
与此Facetile对应的记录插入到RKFace中,其中RKFace.modelId integer是文件名的尾部十六进制版本的十进制数。您可以使用standard dec to hex converter并得出正确的值。例如:
每个子目录(例如“ / 00/00”)在启动新目录之前最多只能容纳256个分面。目录名称也是带有目录的十六进制格式。例如3e,3f。
最佳答案
在尝试渲染照片马赛克时,我也偶然发现了这个问题...
然后我很幸运地找到了master
图片和相应的小图,
让我四处寻找,搜索与文件名中嵌入的数字的十进制和十六进制等效。
这是我想出的(假设您正在搜索名为NAME
的人):
SELECT
printf('%04x', mr.modelId) AS tileId
FROM
RKModelResource mr, RKFace f, RKPerson p
WHERE
f.modelId = mr.attachedModelId
AND f.personId = p.modelId
AND p.displayName = NAME
此
select
以十六进制打印所有RKModelResource.modelIds
,用于命名您要搜索的相应facetiles
。现在需要的只是通往小样的完整路径。因此,一个完整的
bash
脚本可以将一个人的所有这些小面复制(复制到当前目录中的本地文件夹out
中):#!/bin/bash
set -eEu
PHOTOS_PATH=$HOME/Pictures/Photos\ Library.photoslibrary
DB_PATH=$PHOTOS_PATH/database/photos.db
echo $NAME
mkdir -p out/$NAME
TILES=( $(sqlite3 "$DB_PATH" "SELECT printf('%04x', mr.modelId) AS tileId FROM RKModelResource mr, RKFace f, RKPerson p WHERE f.modelId = mr.attachedModelId AND f.personId = p.modelId AND p.displayName='"$NAME"'") )
for TILE in ${TILES[@]}; do
FOLDER=${TILE:0:2}
SOURCE="$PHOTOS_PATH/resources/media/face/$FOLDER/00/facetile_$TILE.jpeg"
[[ -e "$SOURCE" ]] || continue
TARGET=out/$NAME/$TILE.jpeg
[[ -e "$TARGET" ]] && continue
cp "$SOURCE" "$TARGET" || :
done