ฟิลเตอร์ Displace เป็นหนึ่งในเครื่องมือบิดเบือนที่มีประโยชน์ที่สุดของ Photoshop มันบิดเบือนพิกเซลของเลเยอร์ตามค่าความสว่างของแผนที่การเคลื่อนที่แยกต่างหาก ซึ่งเป็นวิธีที่นักออกแบบห่อศิลปะรอบพับผ้า เพิ่มเอฟเฟกต์คลื่น หรือใส่โลโก้บนพื้นผิวที่มีเท็กซ์เจอร์ เมื่อฟิลเตอร์นั้นถูกใช้เป็น smart filter การตั้งค่าจะอยู่ภายในไฟล์ PSD และยังคงแก้ไขได้เต็มที่ บทความนี้แสดงวิธีการอ่านและเขียนข้อมูล smart filter ของ Displace ใน C# คุณจะเพิ่ม Displace smart filter ไปยังเลเยอร์ Smart Object ตั้งค่าตัวเลือกสเกลและการจัดการขอบ ฝังแผนที่การเคลื่อนที่ บันทึกไฟล์ PSD แล้วอ่านการตั้งค่าฟิลเตอร์กลับมาเพื่อยืนยันการทำงานครบวงจร — ทั้งหมดนี้โดยไม่ต้องติดตั้ง Adobe Photoshop.
ประเด็นสำคัญ
- คลาส
DisplaceSmartFilterที่มีใน Aspose.PSD for .NET 26.8 ขึ้นไป เปิดเผยฟิลเตอร์ Displace ของ Photoshop เป็นอ็อบเจ็กต์ .NET ที่มีชนิดอย่างชัดเจน - การปรับสเกลแนวนอนและแนวตั้ง, วิธีการย้ายตำแหน่ง (
TileหรือStretch), และการจัดการพื้นที่ที่ไม่ได้กำหนด (WrapAroundหรือRepeatEdgePixels) ทั้งหมดเป็นคุณสมบัติแบบอ่าน/เขียนง่าย - แผนที่การย้ายตำแหน่งสามารถฝังลงใน PSD ผลลัพธ์ได้โดยส่งค่า
trueไปยังคอนสตรัคเตอร์ ซึ่งทำให้ไฟล์เป็นอิสระและพกพาได้ - ต้องเรียก
SmartFilters.UpdateResourceValues()หลังจากเปลี่ยนแปลงคอลเลกชันฟิลเตอร์ มิฉะนั้นการเปลี่ยนแปลงจะไม่ถูกบันทึก - API เดียวกันสามารถอ่านข้อมูลฟิลเตอร์จากไฟล์ PSD ที่มีอยู่ได้ ทำให้เหมาะสำหรับการตรวจสอบ, การตรวจสอบความถูกต้อง, และการประมวลผลเป็นชุด
ทำไมฟิลเตอร์อัจฉริยะ Displace ถึงสำคัญ
กระบวนการอัตโนมัติการออกแบบมักต้องทำซ้ำเอฟเฟกต์ของ Photoshop ในระดับใหญ่ ตัวอย่างทั่วไปรวมถึงการสร้าง mockup ผลิตภัณฑ์ที่การออกแบบพิมพ์ตามรอยพับของเสื้อยืด การสร้างรูปแบบเทมเพลตที่หลากหลายสำหรับทีมการตลาด หรือการตรวจสอบห้องสมุดของเทมเพลต PSD เพื่อยืนยันว่าไฟล์ทุกไฟล์ใช้การตั้งค่าฟิลเตอร์เดียวกัน
การทำสิ่งนี้ด้วยมือใน Photoshop ไม่สามารถขยายได้ และการแปลงเอฟเฟกต์เป็นพิกเซลทำให้สูญเสียความสามารถในการแก้ไขในภายหลัง โดยการอ่านและเขียนข้อมูลฟิลเตอร์อัจฉริยะ Displace ใน C# คุณจะรักษาฟิลเตอร์ให้ไม่ทำลายและสามารถแก้ไขได้ใน Photoshop ในขณะที่ควบคุมจากโค้ดฝั่งเซิร์ฟเวอร์ งานพื้นหลัง หรือเครื่องมือบนเดสก์ท็อป
การใช้ Aspose.PSD เพื่ออ่านและเขียนข้อมูล Smart Filter Displace
Aspose.PSD for .NET ช่วยให้ผู้พัฒนา C# สามารถอ่านและเขียนข้อมูลฟิลเตอร์อัจฉริยะ Displace ได้โดยตรงผ่านคลาส DisplaceSmartFilter
เริ่มต้นใช้งาน
ติดตั้ง Aspose.PSD NuGet package (เวอร์ชัน 26.8 หรือใหม่กว่า) จาก Package Manager Console:
Install-Package Aspose.PSD
หรือใช้ .NET CLI:
dotnet add package Aspose.PSD
ตัวอย่างด้านล่างใช้เนมสเปซต่อไปนี้:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Aspose.PSD;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Psd.Layers.SmartFilters;
using Aspose.PSD.FileFormats.Psd.Layers.SmartObjects;
คุณจะต้องมีไฟล์อินพุตสองไฟล์: PSD ที่มีอย่างน้อยหนึ่งเลเยอร์ Smart Object, และ PSD ที่ใช้เป็นแผนที่การเคลื่อนที่ (displacement map). สำหรับรายละเอียด API, ดูเอกสาร Aspose.PSD for .NET documentation และ smart filters guide.
DisplaceSmartFilter คุณสมบัติโดยสังเขป
| Property | Type | Purpose |
|---|---|---|
HorizontalScale | double | สเกลการเลื่อนแนวนอน, เช่นเดียวกับในกล่องโต้ตอบ Displace ของ Photoshop |
VerticalScale | double | สเกลการเลื่อนแนวตั้ง |
DisplacementMethod | DisplacementMethod | Tile ทำซ้ำแผนที่; Stretch ปรับขนาดแผนที่ให้พอดีกับเลเยอร์ |
UndefinedAreas | UndefinedAreas | WrapAround หรือ RepeatEdgePixels สำหรับพิกเซลที่เลื่อนออกนอกเลเยอร์ |
IsDisplacementMapEmbedded | bool | ระบุว่าแผนที่ถูกฝังอยู่ในไฟล์ PSD หรือไม่ |
DisplaceMapData | — | ข้อมูลแผนที่การเลื่อนที่ฝังอยู่ |
DisplacementMapPath | string | เส้นทางของแผนที่การเลื่อน |
วิธีเพิ่ม Displace Smart Filter ใน C#
ขั้นตอนแรกคือการโหลดไฟล์ PSD ที่มีเลเยอร์ Smart Object จากนั้นคุณสร้าง DisplaceSmartFilter ตั้งค่าคุณสมบัติของมัน เพิ่มลงในคอลเลกชัน smart filter ของเลเยอร์ และบันทึกผลลัพธ์.
ตัวอย่าง C# ด้านล่างนี้เพิ่มและกำหนดค่าฟิลเตอร์อัจฉริยะ Displace บนเลเยอร์ Smart Object.
string baseFolder = "Data";
string outputFolder = "Output";
Directory.CreateDirectory(outputFolder);
string sourceFile = Path.Combine(baseFolder, "no_displace_filter.psd");
string displaceMapPath = Path.Combine(baseFolder, "displace_map.psd");
string outputFile = Path.Combine(outputFolder, "output_displace_filter.psd");
// Load the source PSD file.
using (PsdImage image = (PsdImage)Image.Load(sourceFile))
{
// Find the first Smart Object layer instead of relying on a hard-coded index.
SmartObjectLayer smartObj = image.Layers.OfType<SmartObjectLayer>().FirstOrDefault()
?? throw new InvalidOperationException("The source PSD has no Smart Object layer.");
// Create the filter. The second argument embeds the displacement map in the output PSD.
DisplaceSmartFilter displace = new DisplaceSmartFilter(displaceMapPath, true)
{
HorizontalScale = 12.5,
VerticalScale = 15.0,
DisplacementMethod = DisplacementMethod.Tile,
UndefinedAreas = UndefinedAreas.WrapAround
};
// Filters is exposed as an array, so copy it to a list, append the new filter,
// and assign the updated array back to the collection.
List<SmartFilter> filters = new List<SmartFilter>(smartObj.SmartFilters.Filters);
filters.Add(displace);
smartObj.SmartFilters.Filters = filters.ToArray();
// Write the updated filter collection into the Smart Object layer's resources.
smartObj.SmartFilters.UpdateResourceValues();
// Save the modified PSD.
image.Save(outputFile);
}
คำอธิบาย
- โหลด PSD –
Image.Loadคืนค่าImageแบบทั่วไป ซึ่งจะถูกแคสต์เป็นPsdImageเพื่อเข้าถึงคุณลักษณะเฉพาะของ PSD เช่น layers และ smart filters. - ค้นหาเลเยอร์ Smart Object –
OfType<SmartObjectLayer>()เลือก Smart Object layer แรกและจะล้มเหลวพร้อมข้อความชัดเจนหากไม่มีเลเยอร์ดังกล่าว วิธีนี้ปลอดภัยกว่าการอ้างอิงโดยตรงไปยังLayersเนื่องจากลำดับของเลเยอร์อาจแตกต่างกันระหว่างไฟล์. - สร้างฟิลเตอร์ – คอนสตรัคเตอร์
DisplaceSmartFilter(string, bool)รับพาธของแผนที่การเคลื่อนที่และแฟล็กที่ควบคุมว่าจะแทรกแผนที่หรือไม่ การส่งค่าtrueทำให้ PSD ผลลัพธ์เป็นไฟล์ที่มีทุกอย่างรวมอยู่ในตัว. - กำหนดค่าฟิลเตอร์ –
HorizontalScaleและVerticalScaleกำหนดความแรงของการเคลื่อนที่DisplacementMethod.Tileทำซ้ำแผนที่ทั่วเลเยอร์ ในขณะที่Stretchปรับขนาดให้พอดีUndefinedAreas.WrapAroundเติมพิกเซลที่เลื่อนออกจากผืนภาพด้วยเนื้อหาจากขอบตรงข้าม;RepeatEdgePixelsจะขยายสีของขอบแทน. - อัปเดตคอลเลกชัน –
SmartFilters.Filtersถูกเปิดเผยเป็นอาร์เรย์ การคัดลอกไปยังList<SmartFilter>แล้วเพิ่มฟิลเตอร์ใหม่ และกำหนดค่าToArray()กลับไป จะรักษา smart filters ที่มีอยู่บนเลเยอร์ไว้. - บันทึกการเปลี่ยนแปลง –
UpdateResourceValues()เขียนคอลเลกชันฟิลเตอร์ลงในทรัพยากร PSD ของเลเยอร์ หากข้ามการเรียกนี้ ฟิลเตอร์ใหม่จะหายไปเมื่อบันทึก. - บันทึก –
image.Save(outputFile)เขียน PSD ที่อัปเดตลงดิสก์.
วิธีอ่านข้อมูล Displace Smart Filter ใน C#
หลังจากบันทึกไฟล์ PSD แล้ว คุณสามารถโหลดไฟล์นั้นใหม่และตรวจสอบคุณสมบัติกรองกรองเพื่อยืนยันว่าค่าทั้งหมดถูกบันทึกอย่างถูกต้อง วิธีเดียวกันนี้ทำงานได้กับไฟล์ PSD ที่สร้างใน Photoshop.
ตัวอย่าง C# ด้านล่างนี้อ่านตัวกรองอัจฉริยะ Displace กลับและตรวจสอบการตั้งค่าของมัน
using (PsdImage image = (PsdImage)Image.Load(outputFile))
{
SmartObjectLayer smartObj = image.Layers.OfType<SmartObjectLayer>().FirstOrDefault()
?? throw new InvalidOperationException("The PSD has no Smart Object layer.");
// Search by type instead of position, so other smart filters on the layer are ignored.
DisplaceSmartFilter displace = smartObj.SmartFilters.Filters
.OfType<DisplaceSmartFilter>()
.LastOrDefault()
?? throw new InvalidOperationException("No Displace smart filter found on the layer.");
Console.WriteLine($"Horizontal scale: {displace.HorizontalScale}");
Console.WriteLine($"Vertical scale: {displace.VerticalScale}");
Console.WriteLine($"Method: {displace.DisplacementMethod}");
Console.WriteLine($"Undefined areas: {displace.UndefinedAreas}");
Console.WriteLine($"Map embedded: {displace.IsDisplacementMapEmbedded}");
// Verify that the saved values match the values written earlier.
AssertAreEqual(12.5, displace.HorizontalScale);
AssertAreEqual(15.0, displace.VerticalScale);
AssertAreEqual(DisplacementMethod.Tile, displace.DisplacementMethod);
AssertAreEqual(UndefinedAreas.WrapAround, displace.UndefinedAreas);
AssertAreEqual(true, displace.IsDisplacementMapEmbedded);
AssertAreEqual(true, displace.DisplaceMapData != null);
}
static void AssertAreEqual(object expected, object actual, string message = null)
{
if (!object.Equals(expected, actual))
{
throw new Exception(message ?? $"Expected {expected}, but got {actual}.");
}
}
คำอธิบาย
- โหลดไฟล์ใหม่ –
Image.Loadเปิดไฟล์ PSD ที่บันทึกไว้ในขั้นตอนก่อนหน้า. - การค้นหาเลเยอร์ Smart Object – การค้นหาตามประเภทเดียวกันทำให้ขั้นตอนการอ่านและเขียนสอดคล้องกัน.
- การค้นหา filter ตามประเภท –
OfType<DisplaceSmartFilter>().LastOrDefault()คืนค่า filter Displace ที่เพิ่มล่าสุดและไม่ทำให้เกิดการแคสต์ที่ไม่ถูกต้อง. วิธีนี้เชื่อถือได้มากกว่าการอ่านสมาชิกอาร์เรย์ตัวสุดท้ายและแคสต์ด้วยasซึ่งจะคืนค่าnullอย่างเงียบหากมี filter อื่นอยู่ในตำแหน่งนั้น. - การอ่านคุณสมบัติ – การตั้งค่าทั้งหมดของ filter มีให้เป็นคุณสมบัติที่กำหนดประเภท ดังนั้นจึงสามารถบันทึก, เปรียบเทียบ หรือส่งออกเป็นรายงานได้.
- การตรวจสอบความถูกต้อง –
AssertAreEqualตัวช่วยเปรียบเทียบค่าที่บันทึกไว้กับค่าต้นฉบับและจะโยนข้อยกเว้นพร้อมข้อความอธิบายเมื่อมีความไม่ตรงกันใด ๆ.
สรุป
ด้วยคลาส DisplaceSmartFilter ใน Aspose.PSD for .NET นักพัฒนา C# สามารถเพิ่ม, กำหนดค่า, บันทึก และอ่านกลับฟิลเตอร์อัจฉริยะ Displace ของ Photoshop ได้อย่างเต็มที่ในโค้ด ฟิลเตอร์จะคงอยู่ในลักษณะที่ไม่ทำลายและสามารถแก้ไขได้ใน Photoshop แผนที่การเคลื่อนที่สามารถเดินทางภายในไฟล์ PSD ได้ และ API เดียวกันสนับสนุนการตรวจสอบแบบรอบครบวงจร สิ่งนี้ทำให้การสร้างเครื่องสร้าง mockup, สายงานเทมเพลต, และเครื่องมือ audit PSD บน .NET เป็นเรื่องง่าย
คำถามที่พบบ่อย
เวอร์ชันใดของ Aspose.PSD for .NET รองรับฟิลเตอร์อัจฉริยะ Displace? การอ่านและเขียนข้อมูลฟิลเตอร์อัจฉริยะ Displace ถูกนำเสนอใน Aspose.PSD for .NET 26.8 ใช้รุ่น 26.8 หรือใหม่กว่าเพื่อเข้าถึงคลาส
DisplaceSmartFilterฉันสามารถเพิ่ม DisplaceSmartFilter ไปยังเลเยอร์แรสเตอร์ทั่วไปได้หรือไม่? ข้อมูล Smart filter จะถูกเก็บไว้กับเลเยอร์ Smart Object ดังนั้นฟิลเตอร์ต้องถูกเพิ่มไปยังคอลเลกชัน
SmartFiltersของSmartObjectLayer. หากเนื้อหาของคุณอยู่บนเลเยอร์ทั่วไป ให้แปลงเป็น Smart Object ก่อน.ฉันจะฝังแผนที่การเลื่อนใน PSD อย่างไร? ส่งพาธของแผนที่การเลื่อนและ
trueไปยังคอนสตรัคเตอร์ของDisplaceSmartFilterหลังจากบันทึก,IsDisplacementMapEmbeddedจะคืนค่าtrueและDisplaceMapDataจะเก็บข้อมูลแผนที่ที่ฝังไว้.ค่าใดบ้างที่คุณสมบัติ UndefinedAreas สามารถรับได้?
UndefinedAreasรองรับWrapAroundซึ่งจะเติมพิกเซลที่ไม่ได้กำหนดด้วยเนื้อหาจากขอบตรงข้ามของภาพ, และRepeatEdgePixelsซึ่งขยายสีของพิกเซลขอบ.ความแตกต่างระหว่าง DisplacementMethod.Tile และ DisplacementMethod.Stretch คืออะไร?
Tileทำซ้ำแผนที่การเลื่อนตำแหน่งทั่วชั้นโดยคงขนาดเดิม, ในขณะที่Stretchปรับขนาดแผนที่ให้พอดีกับชั้น.ฉันต้องเรียกใช้ UpdateResourceValues หลังจากแก้ไข smart filters หรือไม่? ใช่.
UpdateResourceValuesเขียนคอลเลกชันของฟิลเตอร์ที่แก้ไขแล้วลงในทรัพยากรของเลเยอร์ Smart Object. หากไม่ได้ทำเช่นนั้น ฟิลเตอร์ใหม่จะไม่ถูกบันทึกเมื่อคุณบันทึก.
รับใบอนุญาตฟรีและสำรวจเพิ่มเติม
ประเมิน Aspose.PSD for .NET โดยไม่มีข้อจำกัดโดยการขอใบอนุญาตชั่วคราว:
ทรัพยากรเพิ่มเติมสำหรับการทำงานกับไฟล์ PSD ใน .NET:
- Aspose.PSD for .NET เอกสาร
- Aspose.PSD for .NET อ้างอิง API
- การจัดการ Smart Filter ใน Aspose.PSD for C#
- เครื่องมือ PSD ออนไลน์ฟรี
