Working With Text Layers
Add Text Layer
Aspose.PSD for .NET allows you to add text layer in a PSD file. The steps to add text layer in a PSD file are as simple as below:
- Load a PSD file as an image using the factory method Load exposed by Image class
- Call the AddTextLayer method that accepts text and an instance of the Rectangle class
- Save the results
The following code snippet shows you how to add text layer in a PSD file
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string outFileName = dataDir + "OneLayerWithAddedText.psd"; | |
using (PsdImage image = (PsdImage)Image.Load(sourceFileName)) | |
{ | |
image.AddTextLayer("Some text", new Rectangle(50, 50, 100, 100)); | |
PsdOptions options = new PsdOptions(image); | |
image.Save(outFileName, options); | |
} |
Set Text Layer Position
Aspose.PSD for .NET allows you to set a text layer position in a PSD file. The steps to set text layer position in a PSD file are as simple as below:
- Load a PSD file as an image using the factory method Load exposed by Image class
- Call the AddTextLayer method while specifying left and top positions of the text layer
- Save the results
The following code snippet shows you how to set text layer position in a PSD file
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
string exportPath = dataDir + "OneLayer_Edited.psd"; | |
int leftPos = 99; | |
int topPos = 47; | |
var im = (PsdImage)Image.Load(sourceFileName); | |
using (im) | |
{ | |
im.AddTextLayer("Some text", new Rectangle(leftPos, topPos, 99, 47)); | |
TextLayer textLayer = (TextLayer)im.Layers[1]; | |
if (textLayer.Left != leftPos || textLayer.Top != topPos) | |
{ | |
throw new Exception("Was created incorrect Text Layer"); | |
} | |
im.Save(exportPath); | |
} |
Get Text Properties from a Text Layer
Using Aspose.PSD for .NET, you can get and update the text properties of different portions of text available in PSD text layer. This article demonstrates how you can get Paragraphs, Styles and Text properties of the text layer and update them.
The code snippet below shows how to accomplish this requirement.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
const double Tolerance = 0.0001; | |
var filePath = "ThreeColorsParagraphs.psd"; | |
var outputPath = "ThreeColorsParagraph_out.psd"; | |
using (var im = (PsdImage)Image.Load(filePath)) | |
{ | |
for (int i = 0; i < im.Layers.Length; i++) | |
{ | |
var layer = im.Layers[i] as TextLayer; | |
if (layer != null) | |
{ | |
var portions = layer.TextData.Items; | |
if (portions.Length != 4) | |
{ | |
throw new Exception(); | |
} | |
// Checking text of every portion | |
if (portions[0].Text != "Old " || | |
portions[1].Text != "color" || | |
portions[2].Text != " text\r" || | |
portions[3].Text != "Second paragraph\r") | |
{ | |
throw new Exception(); | |
} | |
// Checking paragraphs data | |
// Paragraphs have different justification | |
if ( | |
portions[0].Paragraph.Justification != 0 || | |
portions[1].Paragraph.Justification != 0 || | |
portions[2].Paragraph.Justification != 0 || | |
portions[3].Paragraph.Justification != 2) | |
{ | |
throw new Exception(); | |
} | |
// All other properties of first and second paragraph are equal | |
for (int j = 0; j < portions.Length; j++) | |
{ | |
var paragraph = portions[j].Paragraph; | |
if (Math.Abs(paragraph.AutoLeading - 1.2) > Tolerance || | |
paragraph.AutoHyphenate != false || | |
paragraph.Burasagari != false || | |
paragraph.ConsecutiveHyphens != 8 || | |
Math.Abs(paragraph.StartIndent) > Tolerance || | |
Math.Abs(paragraph.EndIndent) > Tolerance || | |
paragraph.EveryLineComposer != false || | |
Math.Abs(paragraph.FirstLineIndent) > Tolerance || | |
paragraph.GlyphSpacing.Length != 3 || | |
Math.Abs(paragraph.GlyphSpacing[0] - 1) > Tolerance || | |
Math.Abs(paragraph.GlyphSpacing[1] - 1) > Tolerance || | |
Math.Abs(paragraph.GlyphSpacing[2] - 1) > Tolerance || | |
paragraph.Hanging != false || | |
paragraph.HyphenatedWordSize != 6 || | |
paragraph.KinsokuOrder != 0 || | |
paragraph.LetterSpacing.Length != 3 || | |
Math.Abs(paragraph.LetterSpacing[0]) > Tolerance || | |
Math.Abs(paragraph.LetterSpacing[1]) > Tolerance || | |
Math.Abs(paragraph.LetterSpacing[2]) > Tolerance || | |
paragraph.LeadingType != LeadingMode.Auto || | |
paragraph.PreHyphen != 2 || | |
paragraph.PostHyphen != 2 || | |
Math.Abs(paragraph.SpaceBefore) > Tolerance || | |
Math.Abs(paragraph.SpaceAfter) > Tolerance || | |
paragraph.WordSpacing.Length != 3 || | |
Math.Abs(paragraph.WordSpacing[0] - 0.8) > Tolerance || | |
Math.Abs(paragraph.WordSpacing[1] - 1.0) > Tolerance || | |
Math.Abs(paragraph.WordSpacing[2] - 1.33) > Tolerance || | |
Math.Abs(paragraph.Zone - 36.0) > Tolerance) | |
{ | |
throw new Exception(); | |
} | |
} | |
// Checking style data | |
// Styles have different colors and font size | |
if (Math.Abs(portions[0].Style.FontSize - 12) > Tolerance || | |
Math.Abs(portions[1].Style.FontSize - 12) > Tolerance || | |
Math.Abs(portions[2].Style.FontSize - 12) > Tolerance || | |
Math.Abs(portions[3].Style.FontSize - 10) > Tolerance) | |
{ | |
throw new Exception(); | |
} | |
if (portions[0].Style.FillColor != Color.FromArgb(255, 145, 0, 0) || | |
portions[1].Style.FillColor != Color.FromArgb(255, 201, 128, 2) || | |
portions[2].Style.FillColor != Color.FromArgb(255, 18, 143, 4) || | |
portions[3].Style.FillColor != Color.FromArgb(255, 145, 42, 100)) | |
{ | |
throw new Exception(); | |
} | |
for (int j = 0; j < portions.Length; j++) | |
{ | |
var style = portions[j].Style; | |
if (style.AutoLeading != true || | |
style.HindiNumbers != false || | |
style.Kerning != 0 || | |
style.Leading != 0 || | |
style.StrokeColor != Color.FromArgb(255, 175, 90, 163) || | |
style.Tracking != 50) | |
{ | |
throw new Exception(); | |
} | |
} | |
// Example of text editing | |
portions[0].Text = "Hello "; | |
portions[1].Text = "World"; | |
// Example of text portions removing | |
layer.TextData.RemovePortion(3); | |
layer.TextData.RemovePortion(2); | |
// Example of adding new text portion | |
var createdPortion = layer.TextData.ProducePortion(); | |
createdPortion.Text = "!!!\r"; | |
layer.TextData.AddPortion(createdPortion); | |
portions = layer.TextData.Items; | |
// Example of paragraph and style editing for portions | |
// Set right justification | |
portions[0].Paragraph.Justification = 1; | |
portions[1].Paragraph.Justification = 1; | |
portions[2].Paragraph.Justification = 1; | |
// Different colors for each style. The will be changed, but rendering is not fully supported | |
portions[0].Style.FillColor = Color.Aquamarine; | |
portions[1].Style.FillColor = Color.Violet; | |
portions[2].Style.FillColor = Color.LightBlue; | |
// Different font. The will be changed, but rendering is not fully supported | |
portions[0].Style.FontSize = 6; | |
portions[1].Style.FontSize = 8; | |
portions[2].Style.FontSize = 10; | |
layer.TextData.UpdateLayerData(); | |
im.Save(outputPath, new PsdOptions(im)); | |
break; | |
} | |
} | |
} |
Here is another example that demonstrates how a developer can get the text formatting of different text portions from TextLayer using Aspose.PSD for .NET.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
{ | |
List<ITextPortion> regularText = new List<ITextPortion>(); | |
List<ITextPortion> boldText = new List<ITextPortion>(); | |
List<ITextPortion> italicText = new List<ITextPortion>(); | |
var layers = psdImage.Layers; | |
for (int index = 0; index < layers.Length; index++) | |
{ | |
var layer = layers[index]; | |
if (!(layer is TextLayer)) | |
{ | |
continue; | |
} | |
var textLayer = (TextLayer)layer; | |
// gets fonts that contains in text layer | |
var fonts = textLayer.GetFonts(); | |
var textPortions = textLayer.TextData.Items; | |
foreach (var textPortion in textPortions) | |
{ | |
TextFontInfo font = fonts[textPortion.Style.FontIndex]; | |
if (font != null) | |
{ | |
switch (font.Style) | |
{ | |
case FontStyle.Regular: | |
regularText.Add(textPortion); | |
break; | |
case FontStyle.Bold: | |
boldText.Add(textPortion); | |
break; | |
case FontStyle.Italic: | |
italicText.Add(textPortion); | |
break; | |
default: | |
throw new ArgumentOutOfRangeException(); | |
} | |
} | |
} | |
} | |
} |
Update Text Layer In PSD File
Aspose.PSD for .NET allows you to manipulate the text in the text layer of a PSD file. Please use the Aspose.PSD.FileFormats.Psd.Layers.TextLayer class to update text in the PSD layer. The following code snippet loads a PSD file, access the text layer, update the text and save the PSD file with a new name using Aspose.PSD.FileFormats.Psd.Layers.TextLayer.UpdateText method.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// Load a PSD file as an image and cast it into PsdImage | |
using (PsdImage psdImage = (PsdImage)Image.Load(dataDir + "layers.psd")) | |
{ | |
foreach (var layer in psdImage.Layers) | |
{ | |
if (layer is TextLayer) | |
{ | |
TextLayer textLayer = layer as TextLayer; | |
textLayer.UpdateText("test update", new Point(0, 0), 15.0f, Color.Purple); | |
} | |
} | |
psdImage.Save(dataDir + "UpdateTextLayerInPSDFile_out.psd"); | |
} |
Support of Text Layers on Runtime
This article shows how to add text layers on runtime for PSD images. The code snippet has been provided below.
// For complete examples and data files, please go to https://github.com/aspose-psd/Aspose.PSD-for-.NET | |
// Add color overlay layer effect at runtime | |
string sourceFileName = dataDir + "ThreeRegularLayers.psd"; | |
string exportPath = dataDir + "ThreeRegularLayersChanged.psd"; | |
var loadOptions = new PsdLoadOptions() | |
{ | |
LoadEffectsResource = true | |
}; | |
using (var im = (PsdImage)Image.Load(sourceFileName, loadOptions)) | |
{ | |
var effect = im.Layers[1].BlendingOptions.AddColorOverlay(); | |
effect.Color = Color.Green; | |
effect.Opacity = 128; | |
effect.BlendMode = BlendMode.Normal; | |
im.Save(exportPath); | |
} |