Bộ lọc Displace là một trong những công cụ biến dạng hữu ích nhất của Photoshop. Nó biến dạng các pixel của một lớp dựa trên giá trị độ sáng của bản đồ dịch chuyển riêng biệt, cho phép các nhà thiết kế bọc tác phẩm nghệ thuật quanh nếp gấp vải, thêm hiệu ứng gợn sóng, hoặc đặt logo lên các bề mặt có kết cấu. Khi bộ lọc này được áp dụng dưới dạng smart filter, các cài đặt của nó được lưu trong tệp PSD và vẫn có thể chỉnh sửa hoàn toàn. Bài viết này hướng dẫn cách đọc và ghi dữ liệu smart filter Displace trong C#. Bạn sẽ thêm một smart filter Displace vào lớp Smart Object, cấu hình các tùy chọn tỷ lệ và xử lý cạnh, nhúng bản đồ dịch chuyển, lưu PSD, và sau đó đọc lại các cài đặt của bộ lọc để xác nhận quá trình vòng lại — tất cả mà không cần cài đặt Adobe Photoshop.

Những điểm chính

  • Lớp DisplaceSmartFilter, có sẵn trong Aspose.PSD for .NET 26.8 trở lên, cung cấp bộ lọc Displace của Photoshop dưới dạng một đối tượng .NET được định kiểu chặt chẽ.
  • Tỷ lệ ngang và dọc, phương pháp dịch chuyển (Tile hoặc Stretch), và cách xử lý khu vực không xác định (WrapAround hoặc RepeatEdgePixels) đều là các thuộc tính đọc/ghi đơn giản.
  • Bản đồ dịch chuyển có thể được nhúng vào tệp PSD đầu ra bằng cách truyền true vào hàm khởi tạo, giúp tệp tự chứa và di động.
  • Phải gọi SmartFilters.UpdateResourceValues() sau khi thay đổi bộ sưu tập bộ lọc, nếu không các thay đổi sẽ không được lưu.
  • API tương tự đọc lại dữ liệu bộ lọc từ các tệp PSD hiện có, điều này làm cho nó phù hợp cho việc xác thực, kiểm toán và xử lý hàng loạt.

Tại sao Bộ lọc thông minh Displace lại quan trọng

Các quy trình tự động hóa thiết kế thường cần tái tạo các hiệu ứng Photoshop ở quy mô lớn. Các ví dụ điển hình bao gồm tạo mô hình sản phẩm nơi thiết kế in ấn theo các nếp gấp của áo thun, tạo các biến thể mẫu cho các nhóm marketing, hoặc kiểm tra thư viện các mẫu PSD để xác nhận rằng mỗi tệp đều sử dụng cùng một cài đặt bộ lọc.

Thực hiện việc này bằng tay trong Photoshop không mở rộng được, và việc làm phẳng hiệu ứng thành các pixel sẽ mất khả năng chỉnh sửa sau này. Bằng cách đọc và ghi dữ liệu bộ lọc thông minh Displace trong C#, bạn giữ cho bộ lọc không phá hủy và có thể chỉnh sửa trong Photoshop, đồng thời kiểm soát nó từ mã phía máy chủ, các công việc nền, hoặc công cụ máy tính để bàn.

Sử dụng Aspose.PSD để Đọc và Ghi Dữ liệu Bộ lọc Thông minh Displace

Aspose.PSD for .NET cho phép các nhà phát triển C# đọc và ghi dữ liệu bộ lọc thông minh Displace trực tiếp thông qua lớp DisplaceSmartFilter.

Bắt đầu

Cài đặt Aspose.PSD NuGet package (phiên bản 26.8 trở lên) từ Package Manager Console:

Install-Package Aspose.PSD

Hoặc sử dụng .NET CLI:

dotnet add package Aspose.PSD

Các ví dụ dưới đây sử dụng các không gian tên sau:

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;

Bạn cũng sẽ cần hai tệp đầu vào: một tệp PSD chứa ít nhất một lớp Smart Object, và một tệp PSD để sử dụng làm bản đồ dịch chuyển. Đối với chi tiết API, xem tài liệu Aspose.PSD for .NET documentation và hướng dẫn bộ lọc thông minh.

DisplaceSmartFilter Thuộc tính tổng quan

PropertyTypePurpose
HorizontalScaledoubleTỷ lệ dịch chuyển theo chiều ngang, giống như trong hộp thoại Displace của Photoshop
VerticalScaledoubleTỷ lệ dịch chuyển theo chiều dọc
DisplacementMethodDisplacementMethodTile lặp lại bản đồ; Stretch thay đổi kích thước bản đồ để phù hợp với lớp
UndefinedAreasUndefinedAreasWrapAround hoặc RepeatEdgePixels cho các pixel bị dịch ra ngoài lớp
IsDisplacementMapEmbeddedboolCho biết bản đồ có được nhúng trong tệp PSD hay không
DisplaceMapData—Dữ liệu bản đồ dịch chuyển được nhúng
DisplacementMapPathstringĐường dẫn của bản đồ dịch chuyển

Cách Thêm Bộ Lọc Thông Minh Displace trong C#

Bước đầu tiên là tải một tệp PSD chứa lớp Smart Object. Sau đó, bạn tạo một DisplaceSmartFilter, cấu hình các thuộc tính của nó, thêm nó vào bộ sưu tập smart filter của lớp và lưu kết quả.

Ví dụ C# sau đây thêm và cấu hình bộ lọc thông minh Displace trên một lớp 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);
}

Giải thích

  1. Tải PSD – Image.Load trả về một đối tượng Image chung, sau đó được ép kiểu sang PsdImage để truy cập các tính năng đặc thù của PSD như lớp và bộ lọc thông minh.
  2. Tìm lớp Smart Object – OfType<SmartObjectLayer>() chọn lớp Smart Object đầu tiên và đưa ra thông báo lỗi rõ ràng nếu không tồn tại. Điều này an toàn hơn so với việc truy cập trực tiếp vào Layers, vì thứ tự lớp có thể thay đổi giữa các tệp.
  3. Tạo bộ lọc – Hàm khởi tạo DisplaceSmartFilter(string, bool) nhận đường dẫn bản đồ dịch chuyển và một cờ kiểm soát việc nhúng bản đồ. Truyền true làm cho PSD đầu ra tự chứa.
  4. Cấu hình bộ lọc – HorizontalScale và VerticalScale đặt độ mạnh của dịch chuyển. DisplacementMethod.Tile lặp lại bản đồ trên toàn lớp, trong khi Stretch thay đổi kích thước để vừa. UndefinedAreas.WrapAround lấp đầy các pixel bị dịch ra khỏi canvas bằng nội dung từ cạnh đối diện; RepeatEdgePixels mở rộng màu sắc cạnh thay vì vậy.
  5. Cập nhật bộ sưu tập – SmartFilters.Filters được cung cấp dưới dạng mảng. Sao chép nó vào một List<SmartFilter>, thêm bộ lọc mới, và gán lại bằng ToArray() để giữ lại bất kỳ bộ lọc thông minh nào đã có trên lớp.
  6. Lưu lại các thay đổi – UpdateResourceValues() ghi bộ sưu tập bộ lọc vào các tài nguyên PSD của lớp. Bỏ qua lời gọi này sẽ khiến bộ lọc mới bị mất khi lưu.
  7. Lưu – image.Save(outputFile) ghi PSD đã cập nhật vào đĩa.

Cách Đọc Dữ Liệu Bộ Lọc Thông Minh Displace trong C#

Sau khi lưu tệp PSD, bạn có thể tải lại nó và kiểm tra các thuộc tính của bộ lọc để xác nhận rằng mọi giá trị đã được lưu trữ đúng cách. Cách tiếp cận tương tự cũng áp dụng cho các tệp PSD được tạo trong Photoshop.

Ví dụ C# sau đây đọc lại bộ lọc thông minh Displace và xác thực các cài đặt của nó.

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}.");
    }
}

Giải thích

  1. Tải lại tệp – Image.Load mở file PSD đã được lưu ở bước trước.
  2. Xác định lớp Smart Object – Việc tra cứu dựa trên kiểu giống nhau giúp các bước đọc và ghi nhất quán.
  3. Tìm bộ lọc theo kiểu – OfType<DisplaceSmartFilter>().LastOrDefault() trả về bộ lọc Displace được thêm gần nhất và không bao giờ gây ra việc ép kiểu không hợp lệ. Điều này đáng tin cậy hơn so với việc đọc phần tử cuối cùng của mảng và ép kiểu bằng as, vì as sẽ trả về null một cách im lặng nếu một bộ lọc khác nằm ở vị trí đó.
  4. Đọc thuộc tính – Tất cả các cài đặt bộ lọc đều có sẵn dưới dạng các thuộc tính đã được định kiểu, vì vậy chúng có thể được ghi lại, so sánh hoặc xuất ra báo cáo.
  5. Xác thực – Trợ giúp AssertAreEqual so sánh các giá trị đã lưu với các giá trị gốc và ném lỗi kèm thông báo mô tả khi có bất kỳ sự không khớp nào.

Kết luận

Với lớp DisplaceSmartFilter trong Aspose.PSD for .NET, các nhà phát triển C# có thể thêm, cấu hình, lưu và đọc lại các bộ lọc thông minh Photoshop Displace hoàn toàn bằng mã. Bộ lọc này vẫn không phá hủy và có thể chỉnh sửa trong Photoshop, bản đồ dịch chuyển có thể đi kèm trong tệp PSD, và cùng một API hỗ trợ xác thực vòng lặp. Điều này giúp việc xây dựng các công cụ tạo mockup, quy trình mẫu và công cụ kiểm tra PSD trên nền .NET trở nên đơn giản.

Câu hỏi thường gặp

  1. Phiên bản nào của Aspose.PSD for .NET hỗ trợ bộ lọc thông minh Displace? Việc đọc và ghi dữ liệu bộ lọc thông minh Displace đã được giới thiệu trong Aspose.PSD for .NET 26.8. Sử dụng phiên bản 26.8 trở lên để truy cập lớp DisplaceSmartFilter.

  2. Tôi có thể thêm DisplaceSmartFilter vào một lớp raster thông thường không?
    Dữ liệu bộ lọc thông minh được lưu trữ cùng với các lớp Smart Object, vì vậy bộ lọc phải được thêm vào bộ sưu tập SmartFilters của một SmartObjectLayer. Nếu nội dung của bạn nằm trên một lớp thông thường, hãy chuyển nó sang Smart Object trước.

  3. Làm thế nào để nhúng bản đồ dịch chuyển vào PSD? Chuyển đường dẫn tới bản đồ dịch chuyển và true vào hàm khởi tạo DisplaceSmartFilter. Sau khi lưu, IsDisplacementMapEmbedded trả về true và DisplaceMapData chứa dữ liệu bản đồ đã nhúng.

  4. Giá trị nào mà thuộc tính UndefinedAreas có thể nhận? UndefinedAreas hỗ trợ WrapAround, điền các pixel chưa xác định bằng nội dung từ cạnh đối diện của hình ảnh, và RepeatEdgePixels, mở rộng màu sắc của các pixel ở cạnh.

  5. Sự khác nhau giữa DisplacementMethod.Tile và DisplacementMethod.Stretch là gì? Tile lặp lại bản đồ dịch chuyển trên toàn lớp với kích thước gốc, trong khi Stretch thay đổi kích thước bản đồ để phù hợp với lớp.

  6. Tôi có phải gọi UpdateResourceValues sau khi chỉnh sửa bộ lọc thông minh không? Có. UpdateResourceValues ghi bộ sưu tập bộ lọc đã chỉnh sửa vào tài nguyên của lớp Smart Object. Nếu không, bộ lọc mới sẽ không được lưu khi bạn lưu.

Nhận giấy phép miễn phí và khám phá thêm

Đánh giá Aspose.PSD for .NET không giới hạn bằng cách yêu cầu giấy phép tạm thời:

Nhận giấy phép tạm thời miễn phí

Các tài nguyên bổ sung để làm việc với tệp PSD trong .NET:

Đọc thêm