Пытаясь отрисовать фото-мозаику, я тоже наткнулся на эту проблему ...
Тогда мне посчастливилось найти и 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