استفاده از فایلهای PSD به عنوان قالبها برای اتوماسیون - مورد کارتهای تجاری
مرور
این مقاله موارد استفادهشده اغلب را توضیح میدهد که کیشهایی روزآمد هستند که نیاز دارید تا برخی از لایهها را به صورت برنامهنویسی در فایل PSD بهروز کنید، جائی که فایل PSD/PSB یک ساختار مانند قالب شناختهشده دارد. این میتواند برای ایجاد تعداد زیادی از کارتهای تجاری برای افراد مختلف استفاده شود (مورد کارتهای تجاری). یا نیاز دارید که یک ترجمه از فایل PSD به زبانهای مختلف با جایگزینی برخی از مطالب گرافیکی در آن ایجاد کنید.
بعد از خواندن این مقاله خواهید دانست که چگونه میتوانید این کار را انجام دهید:
مورد ساده
به عنوان مثال، شما یک قالب PSD با نامهای لایههای شناختهشده دارید. بنابراین شما نیاز دارید تا با استفاده از زبان C# لایه PSD را تغییر، بهروز و یا جایگزین کنید. در ابتدا شما باید فایل قالب را با 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; | |
} |
هنگامی که لایه پیدا شود، میتوانیم آن را به روش عمومی بهروز کنیم، با استفاده از گرافیک:
چگونه بر روی لایه 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 وجودی کشیدهایم، بنابراین اطلاعات قدیمی در فایل جدید از بین میروند.
اما اگر نیز نیاز داریم تا متن را بهروز کنیم؟ فرآیند مشابه خواهد بود. لایه متن را بر اساس نام آن پیدا کرده و سپس لایه متن را در فایل فتوشاپ بهروز کنیم.
چگونه متن لایه را در فتوشاپ با استفاده از 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 Image ذخیره میکنیم.
چگونه ویژگیهای لایه 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 و یا متن چندخطی با استایلهای مختلف در هر خط تغییر دادهایم.