Використання PSD-файлів як шаблонів для автоматизації - Випадок візиток
Огляд
Ця стаття описує часто використовувані випадки, коли вам потрібно оновлювати деякі шари в PSD-файлі програмно, де PSD/PSB-файл має відому структуру типового шаблону. Це може бути використано для створення великої кількості візиток для різних осіб (Випадок візиток). Або вам потрібно перекласти файл PSD на різні мови заміняючи в ньому графічний матеріал.
Після прочитання цієї статті ви будете знати, як зробити це:
Простий випадок
Наприклад, у вас є деякий PSD-шаблон з відомими назвами шарів. Отже, вам потрібно змінити, оновити або замінити шар PSD через C#. Спочатку вам потрібно відкрити файл шаблону за допомогою Aspose.PSD.
Як відкрити файл PSD за допомогою C#?
// Let's load Image with Picture Frame | |
using (PsdImage image = (PsdImage)Image.Load(sourceFile)) |
Потім нам потрібно знайти шар, який ми хочемо замінити за його назвою. Ось проста реалізація для цього.
Як знайти шар у файлі 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); |
Результуюче зображення:
Складний випадок із додатковими функціями
Вище ми показали найпростіший спосіб заміни зображення в шарі 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 та багатолучевим текстом з різними стилями в кожному рядку.