Photoshop CS6 - Holen Sie sich die Breite des Absatztextes in Pixel per Skript

Gibt es eine Möglichkeit, die Breite des Textes in einem Absatzfeld zu erhalten? Die Messung würde die Verpackung nicht berücksichtigen. Das heißt, es wäre gleich der Summe jeder umbrochenen Zeile.

Ich frage nicht nach der Breite der Box.

Angenommen, ich habe einen Absatztext, der die Zeichenfolge „!!!!!“ enthält. In Arial bei 12pt sind das 23 px. Aber wenn der Inhalt "mmmmm" wäre, wäre die Breite 54px. Die Messung müsste also die Breite der spezifischen Zeichen in der Zeichenfolge berücksichtigen.

Ich kann das mit dem Linealwerkzeug messen, aber gibt es eine Möglichkeit, eine solche Messung in einem Skript zu erhalten?

Könnten Sie den Verpackungsaspekt erläutern? Meine Antwort funktioniert nur, wenn der Text in einer einzigen Zeile steht. Möchten Sie Text in mehreren Zeilen? Beispiel: Zeile 1 ist 45 Pixel groß, Zeile 2 ist 50 Pixel groß, also ist die Summe, nach der Sie suchen, 95 Pixel? Oder 50px?
Scott, ich versuche, ein klumpiges Skript zu erstellen, um Text vertikal in einem Absatzfeld zu zentrieren, und diese Informationen werden bei der Bestimmung der Anzahl der Zeilen berücksichtigt. JohnB, die Antwort, nach der ich suche, wäre gleich der Summe all dieser Zeilen.
@Grant, könntest du im Chat darüber sprechen ? Ich habe eine Idee, aber es ist vielleicht immer noch nicht das, wonach Sie suchen
ähm ... wähle beide Ebenen aus und drücke die mittlere vertikale Schaltfläche in der Steuerleiste? Sie brauchen vertikale Höhen, oder? Warum bezieht sich Ihre Frage dann wiederholt auf die Breite?

Antworten (3)

Kurz gesagt, nicht ohne das Dokument auf eine Weise zu verändern, die nicht sehr nützlich ist. Es folgt ein kleines Brainstorming (in Javascript) ...

Textabmessungen können nur angegeben werden, wenn der Text auf a gesetzt ist kind, TextItem.PARAGRAPHTEXTdaher würde die Herabsetzung des Textumbruchs zusätzliche eigene Berechnungen erfordern, da der PARAGRAPHTYPE einen Umbruch erfordert. In Bezug auf etwas Umsetzbares ist ein kleiner Drilldown erforderlich, um dorthin zu gelangen ...

var doc = activeDocument;
var artLayer = activeDocument.activeLayer;
var textItem = artLayer.textItem;
textItem.kind = TextType.PARAGRAPHTEXT
alert(textItem.width + ", " + textItem.height);

Ich bezweifle jedoch die zurückgegebenen Werte, da die 6-pt-Typ des Wortes „HALLO“ in Times die Abmessungen von 1,49817590332031 pt Breite und 0,69983995056152 pt Höhe zurückgab. Das ist schrecklich falsch, da es ~3 pt mal ~19 pt ist.

Die einzige andere Möglichkeit, die mir einfällt, um die Abmessungen zu erhalten, wäre, den Typ in eine einfache Box zu setzen, kein Umwickeln, auf die Pixelfarbe oben links zuzuschneiden und Ihre Abmessungen auf diese Weise zu erhalten, also ...

var doc = activeDocument;
activeDocument.trim (TrimType.TOPLEFT);
alert(activeDocument.height + ", " + activeDocument.width);

... was 4,248 pt mal 19,368 pt ergibt, dem ich viel mehr vertraue. Aber das ist immer noch eine Trimmaktion, die davon ausgeht, dass sich der Zieltext in einem Dokument befindet.

Die Eigenschaften heightund widthgeben die Maße des Begrenzungsrahmens des Absatzes zurück, denke ich ... richtig? Was die albernen Werte erklären würde , aber ich bin mir nicht sicher, wie Sie so kleine Begrenzungsrahmenwerte erhalten
@JohnB: Ich denke, Sie haben Recht, aber TextItem scheint das niedrigste und atomarste Objekt in der Hierarchie zu sein. Ich denke, die zurückgegebenen Werte sind ein Fehler (Schocker), weil sie meiner Meinung nach keine Grundlage in der Realität haben.

Für einzelne Textzeilen:

Dies ist eine wirklich verrückte Methode, aber Sie könnten die Textebene rastern und dann messen:

var artLayerRef = activeDocument.activeLayer;

var newLayer = artLayerRef.duplicate();
newLayer.rasterize(RasterizeType.ENTIRELAYER);
var width = newLayer.bounds[2] - newLayer.bounds[0];
newLayer.remove();

alert(width);

Ich klone die Ebene, rastere sie, ermittle die Breite und lösche sie dann.

Messskript

Für Text, der umbricht:

Basierend auf der obigen Methode, gleiches Prinzip. Dies ist eine äußerst dumme Art, dies zu tun, aber ich sehe keine Methoden in der Skriptreferenz, die es Ihnen ermöglichen würden, dies auf andere Weise einfach zu erreichen.

Im Wesentlichen setzen wir die Breite des Dokuments auf das Maximum (30.000 Pixel) und das gleiche für das Textfeld. Wenn Ihr Text breiter als 30.000 Pixel ist, funktioniert dies nicht.

preferences.rulerUnits = Units.PIXELS;
var artLayerRef = activeDocument.activeLayer;
var originalUnit = preferences.rulerUnits;
var docH = activeDocument.height;
var docW = activeDocument.width;

var newLayer = artLayerRef.duplicate();
var textItem = newLayer.textItem;

//It might help if the text box's x coordinate is 0 but shouldn't really matter
activeDocument.crop([0, 0, 30000, docH]);  // 30000px = maximum width
textItem.width = 30000; 

newLayer.rasterize(RasterizeType.ENTIRELAYER);
var width = newLayer.bounds[2] - newLayer.bounds[0];
newLayer.remove();

activeDocument.crop([0, 0, docW, docH]);
preferences.rulerUnits = originalUnit;

alert(width);
Gute Idee, aber das setzt auch voraus, dass sich der Text auf einer Ebene befindet und das Dokument wie meins verändert.
Dies wäre ein guter Anfang, wenn es eine Möglichkeit gäbe, zu erkennen, wie viele umbrochene Textzeilen vorhanden sind.
@Grant, würde es Ihnen etwas ausmachen, zu konkretisieren, wie umbrochene Zeilen gehandhabt werden sollten? Ich denke, ich kann mir einen noch rinkigeren Weg ausdenken, um mit gewickelten Linien umzugehen, aber es hängt davon ab, was genau Sie messen möchten
Ich versuche zu messen, wie breit die Schnur wäre, wenn sie nicht gewickelt wäre; wenn es nur Punkttext wäre.
@Grant, ich habe meine Antwort mit einer noch alberneren Methode zum Textumbruch aktualisiert. Mir ist nicht klar, wofür Sie das verwenden, aber vielleicht würde das für Sie funktionieren.

Ich entschuldige mich, aber Ihrer Frage fehlt es an Details darüber, was Sie erreichen möchten. Aufgrund der Tatsache, dass Sie ein Skript verwenden wollten, kann ich vorschlagen, sich Imagemagick anzusehen ? Imagemagick ist terminalbasiert und Sie können Textoptionen skripten, wenn Sie dies erreichen möchten.