Використання PSD-файлів як шаблонів для автоматизації - Випадок візиток

Огляд

Ця стаття описує часто використовувані випадки, коли вам потрібно оновлювати деякі шари в PSD-файлі програмно, де PSD/PSB-файл має відому структуру типового шаблону. Це може бути використано для створення великої кількості візиток для різних осіб (Випадок візиток). Або вам потрібно перекласти файл PSD на різні мови заміняючи в ньому графічний матеріал.

Після прочитання цієї статті ви будете знати, як зробити це:

todo:image_alt_text

Простий випадок

Наприклад, у вас є деякий PSD-шаблон з відомими назвами шарів. Отже, вам потрібно змінити, оновити або замінити шар PSD через C#. Спочатку вам потрібно відкрити файл шаблону за допомогою Aspose.PSD.

Як відкрити файл PSD за допомогою C#?

// Let's load Image with Picture Frame
using (PsdImage image = (PsdImage)Image.Load(sourceFile))

todo:image_alt_text

Потім нам потрібно знайти шар, який ми хочемо замінити за його назвою. Ось проста реалізація для цього.

Як знайти шар у файлі PSD за його назвою

// Using Layer Display Name you can find it in the PSD Image Layers List
private Layer FindLayerByName(PsdImage image, string name)
{
var layers = image.Layers;
foreach (var layer in layers)
{
if (string.Equals(layer.DisplayName, name, StringComparison.InvariantCultureIgnoreCase))
{
return layer;
}
}
return null;
}

Коли шар знайдено, ми можемо оновити його звичайним способом, використовуючи Graphics:

Як малювати на графіці шара PSD

// Let's find layer that we want to replace
var layerToReplace = FindLayerByName(image, "LayerToReplace");
var layers = new List<Layer>(image.Layers);
using (Stream stream = new FileStream(newLayerFile, FileMode.Open))
{
var newLayer = new Layer(stream);
// Drawing of new layer on the old
var graphic = new Graphics(layerToReplace);
graphic.Clear(Color.Empty);
graphic.DrawImage(newLayer, new Rectangle(new Point(), new Size(layerToReplace.Width, layerToReplace.Height)));
}

У цьому випадку ми малюємо нове завантажене PNG-зображення на існуючий шар PSD, тому старі дані будуть втрачені в новому файлі.

Але якщо нам також потрібно оновити текст? Процес буде схожим. Знайдіть Текстовий Шар за його ім’ям, тоді ми програмно оновлюємо Текстовий Шар у Файлі Photoshop за допомогою C#.

Як оновити Текстовий Шар в Photoshop за допомогою C#

// We also can update text layers in PSD file. This can be used for business card create automation
var layerToUpdateText = (TextLayer)FindLayerByName(image, "Place the name of the picture here");
// Simple way to update text
layerToUpdateText.UpdateText("Louis le Grand Dauphin");

Наприкінці нам потрібно зберегти наші зміни:

Як зберегти змінений файл PSD за допомогою Aspose.PSD

// Save PSD file
image.Save(outputFile);

Результуюче зображення:

todo:image_alt_text

Складний випадок із додатковими функціями

Вище ми показали найпростіший спосіб заміни зображення в шарі PSD-файлу.

Проте Aspose.PSD може пропонувати складніші додаткові функції, такі як додавання нового шару, видалення старих шарів та оновлення текстового шару з використанням різних стилів у багатолучевому тексті.

Ми можемо знайти Шар, який ми хочемо замінити, після чого знайти його індекс у списку Шарів, видалити його і вставити новий Шар після створення його з Файлу Jpeg на те саме місце.

Створіть новий шар з файлу та вставте його в зображення PSD з використанням Aspose.PSD

// Finding layer that we want to replace
var layerToReplace = FindLayerByName(image, "LayerToReplace");
var layers = new List<Layer>(image.Layers);
var indexOfLayer = layers.IndexOf(layerToReplace);
layers.Remove(layerToReplace);
using (Stream stream = new FileStream(newLayerFile, FileMode.Open))
{
var newLayer = new Layer(stream);
// We put new layer on the same coordinate and position in Layers as the removed layer
CopyLayerPosition(layerToReplace, newLayer);
layers.Insert(indexOfLayer, newLayer);
// Save list of changed layers
image.Layers = layers.ToArray();
}

У кінцевому коді цього файлу ми виправляємо позицію шару та зберігаємо новий масив Шарів у зображенні Psd.

Як скопіювати властивості шару PsdImage

// Way to Copy Layer Coordinates in Aspose.PSD
void CopyLayerPosition(Layer from, Layer to)
{
to.Left = from.Left;
to.Top = from.Top;
to.Right = from.Right;
to.Bottom = from.Bottom;
}

І на завершення, нам потрібно оновити текстові шари в існуючому зображенні PSD за допомогою C#. Aspose.PSD підтримує оновлення Текстового Шару частинами. Кожна частина тексту має унікальну комбінацію властивостей Стилю та Абзацу.

Як скопіювати властивості шару PsdImage

void UpdateTextLayer(PsdImage image)
{
// We also can update text layers in PSD file. This can be used for business card create automation
var layerToUpdateText = (TextLayer)FindLayerByName(image, "Place the name of the picture here");
// You can create comples text layers with different styles.
var textData = layerToUpdateText.TextData;
// We will use existing style of Text Layer to create new
var textPortion = textData.Items[0];
var defaultStyle = textPortion.Style;
var defaultParagraph = textPortion.Paragraph;
ITextPortion[] newPortions = textData.ProducePortions(
new string[] { "Louis XIV\r", "of France" },
defaultStyle,
defaultParagraph);
// Updating of default styles
newPortions[0].Style.FontSize = 24;
newPortions[0].Style.FillColor = Color.RoyalBlue;
newPortions[1].Style.Leading = 20;
// Removing old text
textData.RemovePortion(0);
// Addint new text portions
foreach (var newPortion in newPortions)
{
textData.AddPortion(newPortion);
}
// Applying text update
textData.UpdateLayerData();
// Fixes of the Layer position, because new text takes 2 rows
layerToUpdateText.Top = layerToUpdateText.Top - 10;
layerToUpdateText.Bottom = layerToUpdateText.Bottom - 10;
}

В результаті ми змінили шаблон PSD за допомогою коду з новим Шаром з файлу Jpeg, Png, J2k, Bmp, Gif або Tiff та багатолучевим текстом з різними стилями в кожному рядку.

todo:image_alt_text