ฟิลเตอร์ 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 คุณสมบัติโดยสังเขป

PropertyTypePurpose
HorizontalScaledoubleสเกลการเลื่อนแนวนอน, เช่นเดียวกับในกล่องโต้ตอบ Displace ของ Photoshop
VerticalScaledoubleสเกลการเลื่อนแนวตั้ง
DisplacementMethodDisplacementMethodTile ทำซ้ำแผนที่; Stretch ปรับขนาดแผนที่ให้พอดีกับเลเยอร์
UndefinedAreasUndefinedAreasWrapAround หรือ RepeatEdgePixels สำหรับพิกเซลที่เลื่อนออกนอกเลเยอร์
IsDisplacementMapEmbeddedboolระบุว่าแผนที่ถูกฝังอยู่ในไฟล์ PSD หรือไม่
DisplaceMapData—ข้อมูลแผนที่การเลื่อนที่ฝังอยู่
DisplacementMapPathstringเส้นทางของแผนที่การเลื่อน

วิธีเพิ่ม 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);
}

คำอธิบาย

  1. โหลด PSD – Image.Load คืนค่า Image แบบทั่วไป ซึ่งจะถูกแคสต์เป็น PsdImage เพื่อเข้าถึงคุณลักษณะเฉพาะของ PSD เช่น layers และ smart filters.
  2. ค้นหาเลเยอร์ Smart Object – OfType<SmartObjectLayer>() เลือก Smart Object layer แรกและจะล้มเหลวพร้อมข้อความชัดเจนหากไม่มีเลเยอร์ดังกล่าว วิธีนี้ปลอดภัยกว่าการอ้างอิงโดยตรงไปยัง Layers เนื่องจากลำดับของเลเยอร์อาจแตกต่างกันระหว่างไฟล์.
  3. สร้างฟิลเตอร์ – คอนสตรัคเตอร์ DisplaceSmartFilter(string, bool) รับพาธของแผนที่การเคลื่อนที่และแฟล็กที่ควบคุมว่าจะแทรกแผนที่หรือไม่ การส่งค่า true ทำให้ PSD ผลลัพธ์เป็นไฟล์ที่มีทุกอย่างรวมอยู่ในตัว.
  4. กำหนดค่าฟิลเตอร์ – HorizontalScale และ VerticalScale กำหนดความแรงของการเคลื่อนที่ DisplacementMethod.Tile ทำซ้ำแผนที่ทั่วเลเยอร์ ในขณะที่ Stretch ปรับขนาดให้พอดี UndefinedAreas.WrapAround เติมพิกเซลที่เลื่อนออกจากผืนภาพด้วยเนื้อหาจากขอบตรงข้าม; RepeatEdgePixels จะขยายสีของขอบแทน.
  5. อัปเดตคอลเลกชัน – SmartFilters.Filters ถูกเปิดเผยเป็นอาร์เรย์ การคัดลอกไปยัง List<SmartFilter> แล้วเพิ่มฟิลเตอร์ใหม่ และกำหนดค่า ToArray() กลับไป จะรักษา smart filters ที่มีอยู่บนเลเยอร์ไว้.
  6. บันทึกการเปลี่ยนแปลง – UpdateResourceValues() เขียนคอลเลกชันฟิลเตอร์ลงในทรัพยากร PSD ของเลเยอร์ หากข้ามการเรียกนี้ ฟิลเตอร์ใหม่จะหายไปเมื่อบันทึก.
  7. บันทึก – 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}.");
    }
}

คำอธิบาย

  1. โหลดไฟล์ใหม่ – Image.Load เปิดไฟล์ PSD ที่บันทึกไว้ในขั้นตอนก่อนหน้า.
  2. การค้นหาเลเยอร์ Smart Object – การค้นหาตามประเภทเดียวกันทำให้ขั้นตอนการอ่านและเขียนสอดคล้องกัน.
  3. การค้นหา filter ตามประเภท – OfType<DisplaceSmartFilter>().LastOrDefault() คืนค่า filter Displace ที่เพิ่มล่าสุดและไม่ทำให้เกิดการแคสต์ที่ไม่ถูกต้อง. วิธีนี้เชื่อถือได้มากกว่าการอ่านสมาชิกอาร์เรย์ตัวสุดท้ายและแคสต์ด้วย as ซึ่งจะคืนค่า null อย่างเงียบหากมี filter อื่นอยู่ในตำแหน่งนั้น.
  4. การอ่านคุณสมบัติ – การตั้งค่าทั้งหมดของ filter มีให้เป็นคุณสมบัติที่กำหนดประเภท ดังนั้นจึงสามารถบันทึก, เปรียบเทียบ หรือส่งออกเป็นรายงานได้.
  5. การตรวจสอบความถูกต้อง – AssertAreEqual ตัวช่วยเปรียบเทียบค่าที่บันทึกไว้กับค่าต้นฉบับและจะโยนข้อยกเว้นพร้อมข้อความอธิบายเมื่อมีความไม่ตรงกันใด ๆ.

สรุป

ด้วยคลาส DisplaceSmartFilter ใน Aspose.PSD for .NET นักพัฒนา C# สามารถเพิ่ม, กำหนดค่า, บันทึก และอ่านกลับฟิลเตอร์อัจฉริยะ Displace ของ Photoshop ได้อย่างเต็มที่ในโค้ด ฟิลเตอร์จะคงอยู่ในลักษณะที่ไม่ทำลายและสามารถแก้ไขได้ใน Photoshop แผนที่การเคลื่อนที่สามารถเดินทางภายในไฟล์ PSD ได้ และ API เดียวกันสนับสนุนการตรวจสอบแบบรอบครบวงจร สิ่งนี้ทำให้การสร้างเครื่องสร้าง mockup, สายงานเทมเพลต, และเครื่องมือ audit PSD บน .NET เป็นเรื่องง่าย

คำถามที่พบบ่อย

  1. เวอร์ชันใดของ Aspose.PSD for .NET รองรับฟิลเตอร์อัจฉริยะ Displace? การอ่านและเขียนข้อมูลฟิลเตอร์อัจฉริยะ Displace ถูกนำเสนอใน Aspose.PSD for .NET 26.8 ใช้รุ่น 26.8 หรือใหม่กว่าเพื่อเข้าถึงคลาส DisplaceSmartFilter

  2. ฉันสามารถเพิ่ม DisplaceSmartFilter ไปยังเลเยอร์แรสเตอร์ทั่วไปได้หรือไม่? ข้อมูล Smart filter จะถูกเก็บไว้กับเลเยอร์ Smart Object ดังนั้นฟิลเตอร์ต้องถูกเพิ่มไปยังคอลเลกชัน SmartFilters ของ SmartObjectLayer. หากเนื้อหาของคุณอยู่บนเลเยอร์ทั่วไป ให้แปลงเป็น Smart Object ก่อน.

  3. ฉันจะฝังแผนที่การเลื่อนใน PSD อย่างไร? ส่งพาธของแผนที่การเลื่อนและ true ไปยังคอนสตรัคเตอร์ของ DisplaceSmartFilter หลังจากบันทึก, IsDisplacementMapEmbedded จะคืนค่า true และ DisplaceMapData จะเก็บข้อมูลแผนที่ที่ฝังไว้.

  4. ค่าใดบ้างที่คุณสมบัติ UndefinedAreas สามารถรับได้? UndefinedAreas รองรับ WrapAround ซึ่งจะเติมพิกเซลที่ไม่ได้กำหนดด้วยเนื้อหาจากขอบตรงข้ามของภาพ, และ RepeatEdgePixels ซึ่งขยายสีของพิกเซลขอบ.

  5. ความแตกต่างระหว่าง DisplacementMethod.Tile และ DisplacementMethod.Stretch คืออะไร? Tile ทำซ้ำแผนที่การเลื่อนตำแหน่งทั่วชั้นโดยคงขนาดเดิม, ในขณะที่ Stretch ปรับขนาดแผนที่ให้พอดีกับชั้น.

  6. ฉันต้องเรียกใช้ UpdateResourceValues หลังจากแก้ไข smart filters หรือไม่? ใช่. UpdateResourceValues เขียนคอลเลกชันของฟิลเตอร์ที่แก้ไขแล้วลงในทรัพยากรของเลเยอร์ Smart Object. หากไม่ได้ทำเช่นนั้น ฟิลเตอร์ใหม่จะไม่ถูกบันทึกเมื่อคุณบันทึก.

รับใบอนุญาตฟรีและสำรวจเพิ่มเติม

ประเมิน Aspose.PSD for .NET โดยไม่มีข้อจำกัดโดยการขอใบอนุญาตชั่วคราว:

รับใบอนุญาตชั่วคราวฟรี

ทรัพยากรเพิ่มเติมสำหรับการทำงานกับไฟล์ PSD ใน .NET:

อ่านต่อ