我已经在两个周末里一直在浏览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并得出正确的值。例如:
sqlite - Apple Photos中与RKFace.modelId对应的facetiles如何?-LMLPHP
每个子目录(例如“ / 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

08-25 05:12