Použití souborů PSD jako šablon pro automatizaci - Případ vizitek
Přehled
Tento článek popisuje často používané případy, kdy je potřeba automaticky aktualizovat některé vrstvy v souboru PSD programově, kdy soubor PSD/PSB má nějakou známou strukturu podobnou šabloně. To lze využít k vytvoření velkého množství vizitek pro různé lidi (Případ vizitek). Nebo potřebujete přeložit soubor PSD do různých jazyků s nahrazením některého grafického materiálu v něm.
Po přečtení tohoto článku budete vědět, jak to udělat:
Jednoduchý případ
Například máte nějakou šablonu PSD s známými názvy vrstev. Takže potřebujete změnit, aktualizovat nebo nahradit vrstvu PSD pomocí C#. Nejprve musíte otevřít soubor šablony s pomocí Aspose.PSD.
Jak otevřít soubor PSD pomocí C#?
// Let's load Image with Picture Frame | |
using (PsdImage image = (PsdImage)Image.Load(sourceFile)) |
Poté musíme najít vrstvu, kterou chceme nahradit podle jejího názvu. Zde je jednoduchá implementace tohoto.
Jak najít vrstvu v souboru PSD podle jejího názvu
// 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; | |
} |
Když je vrstva nalezena, můžeme ji aktualizovat z běžného způsobu pomocí Graphics:
Jak kreslit na vrstvu PSD pomocí Graphics
// 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))); | |
} |
V tomto případě nakreslíme nově načtený PNG obrázek na existující vrstvu PSD, takže stará data budou v novém souboru ztracena.
Ale co když potřebujeme také aktualizovat text? Postup bude podobný. Najděte Textovou vrstvu podle jejího názvu a poté ji programově aktualizujeme Textovou vrstvu souboru Photoshop.
Jak aktualizovat Textovou vrstvu v Photoshopu 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"); |
Nakonec musíme uložit naše změny:
Jak uložit změněný soubor PSD pomocí Aspose.PSD
// Save PSD file | |
image.Save(outputFile); |
Výsledný obrázek:
Složitý případ s dalšími funkcemi
Výše jsme ukázali nejjednodušší způsob nahrazení obrázku ve vrstvě souboru PSD.
Ale Aspose.PSD může nabídnout složitější další funkce, jako je přidání nové vrstvy, odstranění starých vrstev a aktualizace textové vrstvy s použitím různých stylů v textu s více řádky.
Můžeme najít Vrstvu, kterou chceme nahradit, poté najdeme její index ve seznamu vrstev, odstraníme ji a vložíme novou Vrstvu po vytvoření z Jpeg souboru na stejné místo.
Vytvořit novou vrstvu z souboru a vložit ji do obrázku PSD 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 konci tohoto kódu opravíme polohu vrstvy a uložíme nový pole vrstev do obrázku Psd.
Jak zkopírovat vlastnosti vrstvy 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; | |
} |
A nakonec musíme aktualizovat textové vrstvy v existujícím obrázku PSD pomocí C#. Aspose.PSD podporuje aktualizaci textové vrstvy po částech. Každá textová část má jedinečnou kombinaci stylu a vlastností odstavce.
Jak zkopírovat vlastnosti vrstvy 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; | |
} |
Výsledkem je změněná šablona PSD pomocí kódu s novou vrstvou z Jpeg, Png, J2k, Bmp, Gif nebo Tiff souboru a víceřádkovým textem s různými styly v každém řádku.