Wie kann ich die Transformationsmatrix einer Ebene in Photoshop extrahieren?

Ich habe ein intelligentes Objekt in Photoshop CC, das mit der Photoshop-Funktion „Transformieren → Verzerren“ sorgfältig verzerrt wurde. Photoshop verwaltet vermutlich eine Transformationsmatrix für diese Ebene, und ich möchte auf die sechs (?) numerischen Werte dafür zugreifen.

Einige Werte (wie Verschiebung, Skalierung und Drehung) werden in der Transformationsleiste oben auf dem Bildschirm angezeigt, wenn die Ebene transformiert wird, aber leider nicht genug, um eine Matrix zu bilden. Ich habe versucht, über AppleScript auf die Matrixwerte zuzugreifen, aber Photoshop scheint die relevanten Informationen nicht bereitzustellen.

Der Grund, warum ich dies versuche, ist, dass ich die Transformation mithilfe der CSS- transformEigenschaft mit der matrixFunktion neu erstellen kann. Dazu brauche ich vermutlich die Matrix, die Photoshop für die Ebene speichert.

Bearbeiten 1: Wie kann ich alternativ die genauen Koordinaten jeder Ecke des Smart-Objekts erhalten? Ich kann die Transformationsmatrix selbst erstellen, wenn ich diese Koordinaten habe.

Bearbeiten 2: Die Arten von Transformationen, die Photoshop für intelligente Objekte zulässt, bedeuten, dass sie durch eine 3D-Transformationsmatrix dargestellt werden müssen. Wenn Photoshop also intern eine Matrix verwendet, handelt es sich um eine 4x4-Matrix. Ich habe die PSD-Spezifikation durchgesehen, um zu sehen, ob ich die Werte manuell daraus extrahieren oder die Koordinaten der Ecken finden kann, aber ich kann nicht sehen, wo sie gespeichert sind. Ich vermute, dass ich am besten die Koordinaten der Ecken finde und die Matrix selbst erzeuge; Ich habe es beobachtet und es funktioniert relativ gut, aber es wäre schön, die genauen Koordinaten zu haben.

Bearbeiten 3: Falls dies jemandem hilft, habe ich gerade bemerkt, dass Hilfslinien an den Ecken einrasten, wenn Sie sie vom Lineal ziehen, wenn sich das intelligente Objekt im Transformationsmodus befindet (Bearbeiten → Freie Transformation), und ihre Position anzeigen. Leider scheinen sie nur in 0,1-Pixel-Schritten einzurasten, obwohl es so aussieht, als könnten die Ecken feiner gesteuert werden, aber zumindest ist es schneller (und etwas genauer) als nur zu raten.

Haben Sie versucht, alle Photoshop-Transformationen in einer Abfolge von Aktionen aufzuzeichnen? und daraus die Transformationsmatrix extrahieren?
@hsawires Leider arbeite ich mit einer vorhandenen PSD, die ich nicht erstellt habe.

Antworten (1)

Normale Ebenen Photoshop verwaltet keine   Transformationsmatrizen. Sobald Sie die Transformation auf die Ebene übertragen haben, wird sie gerastert und angewendet. Gleiches scheint für Formebenen zu gelten. Es gibt also im Normalfall einfach nichts zu erholen.

Intelligente Objekte und Text haben diese Informationen. Diese Informationen sind in der Skript-API nicht leicht verfügbar. Es ist im SDK als 3x3-Matrix verfügbar, aber das ist ziemlich hardcore. So erhalten Sie die obere Zwei-mal-Zwei-Matrix. Benutzte diesen Stack-Overflow-Post von psycho brm post als Leitfaden. Es funktioniert im Moment nur für Textebenen (und die Ebene muss eine Rotationsskalierung oder Neigung haben).

#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;
}

Jetzt solltest du das zerlegen können.

Bearbeiten : Anscheinend sind die Übersetzungen IDs 720-721 oder Namen txund tyaber ich bekomme immer 0 für sie.

Ich vermute, dass Photoshop die Textebenentransformation wahrscheinlich anders speichert als die Smart-Objekt-Transformation, da PS die Arten von Transformationen einschränkt, die Sie an Text vornehmen können (keine Verzerrung oder Perspektive), und die PSD-Spezifikation scheint auf 2D-Matrizen für Textebenen zu verweisen. Intelligente Objekte können auf andere Weise transformiert werden und erfordern 3D-Matrizen. Ich weiß nicht, wie PS transformierte intelligente Objekte intern speichert, aber ich denke, meine beste Wahl ist wahrscheinlich, stattdessen die Koordinaten jeder der vier Ecken zu finden und die Matrix selbst zu generieren. Leider finde ich auch keine Anleitung dazu!
@Robert stimmte zu, aber ich hatte nicht viel Zeit dafür. 3 mal 3 sollten für ein Flugzeug ausreichen