Есть ли способ получить ширину текста внутри абзаца? Измерение не будет учитывать упаковку. То есть он будет равен сумме каждой обернутой строки.
Я не спрашиваю о ширине коробки.
Например, предположим, что у меня есть текст абзаца, содержащий строку «!!!!!». В Arial размером 12pt это 23 пикселя. Но если бы содержимое было «ммммм», ширина была бы 54 пикселя. Таким образом, при измерении необходимо учитывать ширину конкретных символов в строке.
Я могу измерить это с помощью линейки, но есть ли способ получить такое измерение в сценарии?
Короче говоря, не без изменения документа каким-то образом, что не очень полезно. Далее следует небольшой мозговой штурм (на 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
возвращают размеры ограничивающей рамки абзаца... верно? Это объяснило бы дурацкие значения, но я не уверен, как вы получаете такие крошечные значения ограничительной рамки.Это действительно нехилый способ сделать это, но вы можете растеризовать текстовый слой, а затем измерить его:
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);
Прошу прощения, но в вашем вопросе не хватает подробностей о том, чего вы пытаетесь достичь. Основываясь на том факте, что вы хотели использовать скрипт, могу ли я предложить изучить Imagemagick ? Imagemagick основан на терминале, и вам будет разрешено записывать текстовые опции, если вы пытаетесь это сделать.
ДжонБи
Грант
ДжонБи
Скотт