У меня есть смарт-объект в Photoshop CC, который был тщательно искажен с помощью функции Photoshop «Transform → Distort». Photoshop предположительно управляет матрицей преобразования для этого слоя, и я хочу получить доступ к шести (?) числовым значениям для него.
Некоторые значения (такие как перемещение, масштаб и поворот) задаются на панели преобразования в верхней части экрана при преобразовании слоя, но, к сожалению, их недостаточно для формирования матрицы. Я пытался получить доступ к значениям матрицы через AppleScript, но Photoshop, похоже, не предоставляет соответствующей информации.
Причина, по которой я пытаюсь это сделать, заключается в том, что я могу воссоздать преобразование, используя transform
свойство CSS с помощью matrix
функции. Для этого мне, вероятно, нужна матрица, которую Photoshop хранит для слоя.
Редактировать 1: В качестве альтернативы, как я могу получить точные координаты каждого угла смарт-объекта? Я могу сам сгенерировать матрицу преобразования , если у меня есть эти координаты.
Редактировать 2: Типы преобразований, которые Photoshop допускает для смарт-объектов, означают, что они должны быть представлены матрицей 3D-преобразования, поэтому, если Photoshop использует внутреннюю матрицу, то это будет матрица 4x4. Я просматривал спецификацию PSD, чтобы узнать, могу ли я извлечь из нее значения вручную или найти координаты углов, но я не вижу, где они хранятся. Я подозреваю, что лучше всего мне найти координаты углов и самому создать матрицу; Я присматривался к нему, и он работает относительно хорошо, но было бы неплохо иметь точные координаты.
Редактировать 3: Если это кому-нибудь поможет, я только что заметил, что если смарт-объект находится в режиме преобразования (Редактировать → Свободное преобразование), направляющие будут привязаны к углам, если вы перетащите их с линейки, показывая их положение. К сожалению, кажется, что они привязываются только к шагу 0,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.
hsawires
Роберт