Korzystanie z plików PSD jako szablonów do automatyzacji - Przypadek wizytówek

Przegląd

Ten artykuł opisuje często stosowane przypadki, gdy konieczne jest aktualizowanie niektórych warstw w pliku PSD programowo, gdzie plik PSD/PSB ma strukturę przypominającą szablon. Można to wykorzystać do tworzenia dużej ilości wizytówek dla różnych osób (Przypadek wizytówek). Lub gdy musisz przetłumaczyć plik PSD na różne języki z zamianą pewnych materiałów graficznych w nim.

Po przeczytaniu tego artykułu dowiesz się, jak to zrobić:

todo:image_alt_text

Prosty przypadek

Na przykład masz szablon PSD z znanymi nazwami warstw. Potrzebujesz więc zmienić, zaktualizować lub zamienić warstwę PSD za pomocą C#. Na początek musisz otworzyć plik szablonu za pomocą Aspose.PSD.

Jak otworzyć plik PSD za pomocą C#?

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

todo:image_alt_text

Następnie musimy znaleźć warstwę, którą chcemy zastąpić za jej nazwą. Oto prosty sposób implementacji tego.

Jak znaleźć warstwę w pliku PSD po jej nazwie

// 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;
}

Gdy znajdziemy warstwę, możemy ją zaktualizować w standardowy sposób, korzystając z Grafiki:

Jak rysować na warstwie PSD Grafiki

// 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)));
}

W tym konkretnym przypadku rysujemy nowo załadowany obraz PNG na istniejącej warstwie PSD, dzięki czemu stare dane zostaną utracone w nowym pliku.

Ale co jeśli musimy także zaktualizować tekst? Proces będzie podobny. Znajdź Warstwę Tekstu po jej nazwie, a następnie dokonaj programowej aktualizacji Warstwy Tekstu w pliku Photoshopa za pomocą C#.

Jak zaktualizować Warstwę Tekstu w Photoshopie za pomocą 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");

Na końcu musimy zapisać nasze zmiany:

Jak zapisać zmieniony plik PSD za pomocą Aspose.PSD

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

Otrzymany obrazek:

todo:image_alt_text

Skomplikowany przypadek z dodatkowymi funkcjami

Powyżej pokazaliśmy najprostszy sposób zastąpienia obrazka w warstwie pliku PSD.

Ale Aspose.PSD może zaoferować bardziej złożone dodatkowe funkcje, takie jak dodawanie nowej warstwy, usuwanie starych warstw oraz aktualizacja warstwy tekstu z wykorzystaniem różnych stylów w tekście wieloliniowym.

Możemy znaleźć Warstwę, którą chcemy zastąpić, następnie znajdujemy jej indeks na liście Warstw, usuwamy ją i wstawiamy nową warstwę po jej stworzeniu z Pliku Jpeg w to samo miejsce.

Utwórz nową warstwę z pliku i wstaw ją do obrazu PSD za pomocą 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();
}

Na końcu tego pliku ze snipetem kodu poprawiamy pozycję warstwy i zapisujemy nową tablicę warstw w obrazie PSD.

Jak skopiować właściwości warstwy 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;
}

I na koniec, musimy zaktualizować warstwy tekstowe w istniejącym obrazie PSD za pomocą C#. Aspose.PSD obsługuje aktualizację Warstwy Tekstu po Częściach. Każda część tekstu ma unikalną kombinację stylu i właściwości akapitu.

Jak skopiować właściwości warstwy 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;
}

W rezultacie, zmieniliśmy szablon PSD za pomocą kodu, dodając nową warstwę z pliku Jpeg, Png, J2k, Bmp, Gif lub Tiff oraz wieloliniowy tekst z różnymi stylami w każdym wierszu.

todo:image_alt_text