Как извлечь матрицу преобразования слоя в Photoshop?

У меня есть смарт-объект в Photoshop CC, который был тщательно искажен с помощью функции Photoshop «Transform → Distort». Photoshop предположительно управляет матрицей преобразования для этого слоя, и я хочу получить доступ к шести (?) числовым значениям для него.

Некоторые значения (такие как перемещение, масштаб и поворот) задаются на панели преобразования в верхней части экрана при преобразовании слоя, но, к сожалению, их недостаточно для формирования матрицы. Я пытался получить доступ к значениям матрицы через AppleScript, но Photoshop, похоже, не предоставляет соответствующей информации.

Причина, по которой я пытаюсь это сделать, заключается в том, что я могу воссоздать преобразование, используя transformсвойство CSS с помощью matrixфункции. Для этого мне, вероятно, нужна матрица, которую Photoshop хранит для слоя.

Редактировать 1: В качестве альтернативы, как я могу получить точные координаты каждого угла смарт-объекта? Я могу сам сгенерировать матрицу преобразования , если у меня есть эти координаты.

Редактировать 2: Типы преобразований, которые Photoshop допускает для смарт-объектов, означают, что они должны быть представлены матрицей 3D-преобразования, поэтому, если Photoshop использует внутреннюю матрицу, то это будет матрица 4x4. Я просматривал спецификацию PSD, чтобы узнать, могу ли я извлечь из нее значения вручную или найти координаты углов, но я не вижу, где они хранятся. Я подозреваю, что лучше всего мне найти координаты углов и самому создать матрицу; Я присматривался к нему, и он работает относительно хорошо, но было бы неплохо иметь точные координаты.

Редактировать 3: Если это кому-нибудь поможет, я только что заметил, что если смарт-объект находится в режиме преобразования (Редактировать → Свободное преобразование), направляющие будут привязаны к углам, если вы перетащите их с линейки, показывая их положение. К сожалению, кажется, что они привязываются только к шагу 0,1 пикселя, хотя кажется, что углы можно более точно контролировать, но, по крайней мере, это быстрее (и несколько точнее), чем просто угадывание.

Вы пытались записать все преобразования Photoshop в последовательность действий? и извлечь из него матрицу преобразования?
@hsawires К сожалению, я работаю с существующим PSD, который я не создавал.

Ответы (1)

Обычные слои Photoshop не   управляет матрицами преобразования. Как только вы зафиксируете преобразование, слой растрируется и применяется. То же самое относится и к слоям формы. Так что восстанавливать в общем случае просто нечего.

Смарт-объекты и текст содержат эту информацию. Эта информация недоступна в скриптах API. Он доступен в SDK в виде матрицы 3x3, но это довольно хардкорно. Вот как вы можете получить верхнюю матрицу два на два. В качестве руководства использовал этот пост о переполнении стека , написанный психо-брм- постом. На данный момент это работает только для текстовых слоев (и слой должен иметь масштаб вращения или наклон).

#target photoshop
var doc = app.activeDocument;

alert(getTransformMatrix2by2())

function getTransformMatrix2by2()
{
    var ref = new ActionReference();
    ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
    var desc = executeActionGet(ref).getObjectValue(stringIDToTypeID('textKey'));
    if (desc.hasKey(stringIDToTypeID('transform')))
    {
        var matrix = [['xx','xy'],['yx','yy']];
        desc = desc.getObjectValue(stringIDToTypeID('transform'));
        for (var i=0;i < matrix.length;i++){
            var row = matrix[i];
            for (var j=0;j < row.length;j++){
               matrix[i][j] = desc.getDouble(stringIDToTypeID(matrix[i][j]));
            }
        }
        return matrix;
    }
    return undefined;
}

Теперь вы должны быть в состоянии разложить это.

Редактировать : по-видимому, переводы - это идентификаторы 720-721 или имена, txно tyя продолжаю получать для них 0.

Я подозреваю, что Photoshop, вероятно, хранит преобразование текстового слоя иначе, чем преобразование смарт-объекта, потому что PS ограничивает типы преобразований, которые вы можете выполнять для текста (без искажения или перспективы), а спецификация PSD, похоже, ссылается на 2D-матрицы для текстовых слоев. Смарт-объекты можно преобразовывать другими способами, и для них требуются трехмерные матрицы. Я не знаю, как PS внутренне хранит преобразованные смарт-объекты, но я думаю, что лучше всего, вероятно, найти координаты каждого из четырех углов и создать матрицу самостоятельно. К сожалению, я тоже не могу найти, как это сделать!
@Robert согласился, но у меня не было на это много времени. 3 на 3 должно быть достаточно для самолета