Photoshop CS6 - Получить ширину текста абзаца в пикселях по сценарию

Есть ли способ получить ширину текста внутри абзаца? Измерение не будет учитывать упаковку. То есть он будет равен сумме каждой обернутой строки.

Я не спрашиваю о ширине коробки.

Например, предположим, что у меня есть текст абзаца, содержащий строку «!!!!!». В Arial размером 12pt это 23 пикселя. Но если бы содержимое было «ммммм», ширина была бы 54 пикселя. Таким образом, при измерении необходимо учитывать ширину конкретных символов в строке.

Я могу измерить это с помощью линейки, но есть ли способ получить такое измерение в сценарии?

Не могли бы вы уточнить аспект упаковки? Мой ответ работает, только если текст находится в одной строке. Вам нужен текст в несколько строк? Пример: строка 1 — 45 пикселей, строка 2 — 50 пикселей, поэтому искомая сумма составляет 95 пикселей? Или 50px?
Скотт, я пытаюсь сделать неуклюжий сценарий для вертикального центрирования текста в поле абзаца, и эта информация будет учитываться при определении количества строк. JohnB, Ответ, который я ищу, будет равен сумме всех этих строк.
@ Грант, ты не мог бы поговорить об этом в чате ? У меня есть идея, но она все еще может быть не тем, что вы ищете
эммм... выберите оба слоя и нажмите центральную вертикальную кнопку на панели управления? Вам нужна вертикальная высота, верно? Почему тогда ваш вопрос постоянно ссылается на ширину?

Ответы (3)

Короче говоря, не без изменения документа каким-то образом, что не очень полезно. Далее следует небольшой мозговой штурм (на Javascript)...

Размеры текста могут быть указаны только в том случае, если для текста установлено значение a kindиз TextItem.PARAGRAPHTEXT, поэтому для исключения обтекания текста потребуются дополнительные вычисления, поскольку PARAGRAPHTYPE требует обтекания. С точки зрения чего-то действенного, нужно немного потренироваться, чтобы туда добраться...

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

Однако я сомневаюсь в возвращаемых значениях, поскольку тип слова «HELLO» размером 6 pt в Times возвращал размеры 1,49817590332031 pt в ширину и 0,69983995056152 pt в высоту. Это ужасно неправильно, так как это ~ 3 pt на ~ 19 pt.

Единственный другой способ, который я могу придумать, чтобы получить размеры, - это установить тип в простом поле, без обтекания, обрезать до цвета верхнего левого пикселя и получить ваши размеры таким образом, так что...

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

... что дает 4,248 pt на 19,368 pt, чему я доверяю гораздо больше. Но, тем не менее, это действие обрезки, которое предполагает, что целевой текст находится в документе сам по себе.

Я думаю , что свойства heightи widthвозвращают размеры ограничивающей рамки абзаца... верно? Это объяснило бы дурацкие значения, но я не уверен, как вы получаете такие крошечные значения ограничительной рамки.
@JohnB: Я думаю, вы правы, но TextItem кажется самым низким и атомарным объектом в иерархии. Я думаю, что возвращаемые значения являются ошибкой (шокером), потому что они не имеют реальной основы из того, что я вижу.

Для отдельных строк текста:

Это действительно нехилый способ сделать это, но вы можете растеризовать текстовый слой, а затем измерить его:

var artLayerRef = activeDocument.activeLayer;

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

alert(width);

Я клонирую слой, растрирую его, получаю ширину, затем удаляю.

Сценарий измерения

Для текста, который переносится:

Основываясь на методе выше, тот же принцип. Это чрезвычайно глупый способ сделать это, но я не вижу в справочнике по сценариям каких-либо методов, которые позволили бы вам легко это сделать.

По сути, мы устанавливаем максимальную ширину документа (30 000 пикселей) и то же самое для текстового поля. Если ваш текст шире 30 000 пикселей, это не сработает.

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);
Хорошая идея, хотя это также предполагает, что текст сам по себе находится на слое и изменяет документ, как мой.
Это было бы хорошим началом, если бы существовал способ определения количества перенесенных строк текста.
@ Грант, не могли бы вы уточнить, как следует обрабатывать завернутые строки? Я думаю, что могу придумать еще более дурацкий способ обработки обернутых строк, но это зависит от того, что именно вы пытаетесь измерить.
Я пытаюсь измерить ширину строки, если бы она не была обернута; если бы это был просто точечный текст.
@Grant, я обновил свой ответ еще более глупым методом переноса текста. Я не понимаю, для чего вы это используете, но, возможно, это сработает для вас.

Прошу прощения, но в вашем вопросе не хватает подробностей о том, чего вы пытаетесь достичь. Основываясь на том факте, что вы хотели использовать скрипт, могу ли я предложить изучить Imagemagick ? Imagemagick основан на терминале, и вам будет разрешено записывать текстовые опции, если вы пытаетесь это сделать.