스마트 오브젝트와 해당 레이어 효과는 코드를 통해 파일을 처리할 때 손실됩니다. 포토샵 파일을 다루는 개발자들은 종종 이 문제에 직면합니다. 이 가이드는 C#을 사용하여 PSD 파일에서 스마트 오브젝트와 효과를 처리하는 방법을 보여줍니다. 효과를 유지한 채 PSD를 로드하고, 스마트 오브젝트의 자체 콘텐츠를 추출하며, 효과를 포함한 스마트 오브젝트를 독립적인 PNG 파일로 저장합니다.

스마트 오브젝트는 Photoshop이 레이어 내부에서 비파괴적으로 편집할 수 있도록 하는 임베드되거나 연결된 이미지 콘텐츠입니다. 스마트 오브젝트를 포함한 PSD를 일반 이미지 라이브러리로 열면, 라이브러리는 일반적으로 스마트 오브젝트 자체 콘텐츠와 그 위에 적용된 드롭 섀도우, 글로우, 베벨과 같은 레이어 효과를 모두 버립니다. 그 결과는 시각적 세부 사항이 누락된 평탄화된 래스터 이미지가 되어, 정확한 시각적 충실도를 요구하는 모든 워크플로우에서 깨진 경험을 초래합니다. Aspose.PSD for .NET은 전용 SmartObjectLayer 클래스와 PsdLoadOptions.LoadEffectsResource 플래그를 제공하여 이러한 효과를 유지하므로, 프로그래밍 방식으로 스마트 오브젝트의 콘텐츠를 추출하고 스타일을 잃지 않은 효과가 포함된 충실한 렌더링을 내보낼 수 있습니다.

PSD 파일에서 스마트 오브젝트와 효과를 처리하는 이유

스마트 오브젝트 콘텐츠와 효과를 보존하는 것은 여러 실제 시나리오에서 중요합니다. 그래픽 디자인 파이프라인은 종종 템플릿에서 단일 스마트 오브젝트를 추출하여 웹이나 모바일용 독립 자산으로 사용해야 합니다. 변환 중에 해당 레이어의 효과가 누락되면 디자이너가 수동으로 다시 적용해야 하며, 이는 자동화의 목적에 어긋납니다. PSD 파일을 미리보기 생성용으로 수집하는 콘텐츠 관리 시스템도 모든 레이어와 효과를 포함한 정확한 표현이 필요합니다.

Aspose.PSD는 두 개의 관련 있지만 구별되는 작업에 대해 명시적인 제어를 제공합니다: 스마트 오브젝트 자체에 내장된 소스(원래 배치된 이미지)를 읽는 것과 레이어 효과가 적용된 상태로 캔버스에 표시되는 스마트 오브젝트를 렌더링하는 것. 이 두 작업을 별도로 유지하는 것이 중요합니다 — 이를 혼동하는 것이 API의 이 부분을 사용할 때 가장 흔한 실수이며, 이 튜토리얼에서는 두 작업을 올바르게 수행하는 방법을 안내합니다.

Aspose.PSD를 사용하여 PSD 파일에서 스마트 오브젝트 및 효과 처리

스마트 오브젝트 작업을 시작하려면 .NET 프로젝트에 Aspose.PSD 라이브러리를 설치해야 합니다. 가장 쉬운 방법은 NuGet을 통해서입니다:

Install-Package Aspose.PSD

패키지를 참조하면, Aspose.PSD product page에서 전체 API 문서를 탐색할 수 있습니다. 이 튜토리얼에서 사용되는 주요 클래스는 다음과 같습니다:

  • PsdLoadOptions (namespace Aspose.PSD.ImageLoadOptions) — PSD 파일이 어떻게 구문 분석되는지 제어하며, 레이어 효과 리소스를 로드할지 여부를 포함합니다.
  • Image.Load — 파일 경로와 로드 옵션으로부터 Image 인스턴스를 생성하는 정적 팩터리 메서드입니다.
  • SmartObjectLayer (namespace Aspose.PSD.FileFormats.Psd.Layers.SmartObjects) — PSD 파일 내부의 스마트 오브젝트를 나타냅니다. 포함된 콘텐츠를 읽기 위해 LoadContentsExportContents를 제공합니다.
  • PsdImage (namespace Aspose.PSD.FileFormats.Psd) — PSD 파일에 대한 구체적인 이미지 유형입니다.
  • Layer.IsVisible (namespace Aspose.PSD.FileFormats.Psd.Layers) — 레이어의 가시성을 전환하며, 저장하기 전에 특정 레이어를 격리하는 방법입니다.
  • PngOptionsPngColorType — PNG 내보내기를 구성합니다. 특히 투명 출력을 필요로 할 때 유용합니다.

다음 섹션에서는 각 단계를 시연하는 완전한 엔드‑투‑엔드 예제를 단계별로 살펴봅니다.

PSD 파일에서 스마트 오브젝트 및 효과 처리: 단계별 가이드

아래는 PSD에서 스마트 오브젝트를 찾아 해당 임베드된 콘텐츠를 내보내고, 스마트 오브젝트 레이어를 별도로 렌더링하여 효과와 함께 PNG로 저장하는 실용적인 단계별 안내입니다.

1. 파일 경로 및 로드 옵션 준비

입력 PSD 파일과 출력 PNG 대상지를 정의합니다. 또한 LoadEffectsResourcetrue로 설정하여 효과 리소스 로드를 활성화해야 합니다. 이렇게 하면 스마트 오브젝트의 레이어 효과가 저장 시 최종 병합 이미지에 렌더링됩니다.

string srcFile = Path.Combine(baseFolder, "sample-with-smart-object.psd");
string contentFile = Path.Combine(outputFolder, "smart-object-content.png");
string renderedFile = Path.Combine(outputFolder, "smart-object-rendered.png");

PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
psdLoadOptions.LoadEffectsResource = true;

2. 효과 리소스가 포함된 PSD 이미지 로드

Image.Load는 이전에 구성된 옵션을 사용하여 파일을 읽습니다. PsdImage로 캐스팅하면 레이어 컬렉션과 같은 PSD 전용 멤버에 접근할 수 있습니다.

using (PsdImage psdImage = (PsdImage)Image.Load(srcFile, psdLoadOptions))
{
    // Subsequent code works inside this using block
}

using 문은 관리되지 않는 리소스가 신속하게 해제되도록 보장하며, 이는 특히 큰 PSD 파일에 중요합니다.

3. SmartObjectLayer 찾기

PSD는 많은 레이어 유형을 포함할 수 있으므로 고정된 인덱스를 가정하기보다 각 레이어를 확인하십시오. is 패턴은 SmartObjectLayer가 아닐 때 null을 반환하고(레이어를 건너뜁니다).

SmartObjectLayer smartObject = null;
foreach (Layer layer in psdImage.Layers)
{
    if (layer is SmartObjectLayer soLayer)
    {
        smartObject = soLayer;
        break;
    }
}

if (smartObject == null)
{
    Console.WriteLine("No smart object layer found in this PSD.");
    return;
}

4. 스마트 오브젝트 자체에 포함된 임베디드 콘텐츠 내보내기

각 스마트 오브젝트는 자체적으로 포함되거나 연결된 이미지 콘텐츠—원래 해당 오브젝트에 배치된 파일—를 저장합니다. LoadContents를 호출하면 해당 콘텐츠가 Image 형태로 반환되며, API의 참조 예제에서는 이를 RasterImage로 캐스팅합니다. PngOptions를 사용하여 저장하면 원본 콘텐츠가 어떤 형식으로 포함되었든 PNG 출력이 보장됩니다.

using (RasterImage innerContent = (RasterImage)smartObject.LoadContents(null))
{
    innerContent.Save(contentFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });
}

결과 파일(smart-object-content.png)은 외부 PSD의 레이어 효과가 적용되기 전, 스마트 오브젝트 자체의 원본 이미지입니다. 원본 형식 그대로 내용이 필요하다면, smartObject.ExportContents(path)가 한 번의 호출로 동일한 내보내기를 수행하고 해당 원본 형식의 확장자를 사용하여 저장합니다.

5. 스마트 오브젝트 레이어를 효과가 적용된 상태로 렌더링

레이어 효과 — 드롭 섀도우, 글로우, 베벨 —는 외부 문서에 속하며 스마트 오브젝트 자체 콘텐츠에 속하지 않으므로 LoadContents에 포함되지 않습니다. 캔버스에 표시되는 대로 효과가 포함된 스마트 오브젝트의 평면 이미지를 얻으려면, 다른 모든 레이어를 숨기고 전체 PsdImage를 저장합니다. LoadEffectsResource가 로드 시 true로 설정되었기 때문에, Aspose.PSD는 지원되는 효과를 최종 병합된 이미지에 렌더링합니다.

foreach (Layer layer in psdImage.Layers)
{
    if (!ReferenceEquals(layer, smartObject))
    {
        layer.IsVisible = false;
    }
}

psdImage.Save(renderedFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });

결과 파일(smart-object-rendered.png)은 스마트 오브젝트만 표시하며, 그 효과는 Photoshop이 표시하는 그대로 정확히 렌더링됩니다.

6. 전체 코드 목록

다음 예제는 두 단계를 하나의 독립 실행형 프로그램으로 결합합니다: 스마트 개체를 찾아 해당 콘텐츠를 내보낸 다음, 효과가 적용된 레이어를 분리하고 렌더링합니다.

using System;
using System.IO;
using Aspose.PSD;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Psd.Layers;
using Aspose.PSD.FileFormats.Psd.Layers.SmartObjects;
using Aspose.PSD.FileFormats.Png;
using Aspose.PSD.ImageLoadOptions;
using Aspose.PSD.ImageOptions;

class SmartObjectHandler
{
    static void Main()
    {
        string baseFolder = @"C:\Input";   // folder containing the source PSD
        string outputFolder = @"C:\Output"; // folder for the PNG results

string srcFile = Path.Combine(baseFolder, "sample-with-smart-object.psd");
        string contentFile = Path.Combine(outputFolder, "smart-object-content.png");
        string renderedFile = Path.Combine(outputFolder, "smart-object-rendered.png");

Directory.CreateDirectory(outputFolder);

// Enable loading of effect resources so that layer effects are rendered on save
        PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
        psdLoadOptions.LoadEffectsResource = true;

using (PsdImage psdImage = (PsdImage)Image.Load(srcFile, psdLoadOptions))
        {
            // Find the first smart object layer
            SmartObjectLayer smartObject = null;
            foreach (Layer layer in psdImage.Layers)
            {
                if (layer is SmartObjectLayer soLayer)
                {
                    smartObject = soLayer;
                    break;
                }
            }

if (smartObject == null)
            {
                Console.WriteLine("No smart object layer found in this PSD.");
                return;
            }

// 1. Export the smart object's own embedded content (before outer effects)
            using (RasterImage innerContent = (RasterImage)smartObject.LoadContents(null))
            {
                innerContent.Save(contentFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });
            }
            Console.WriteLine($"Smart object content saved to {contentFile}");

// 2. Isolate the smart object layer and save the document to bake in its effects
            foreach (Layer layer in psdImage.Layers)
            {
                if (!ReferenceEquals(layer, smartObject))
                {
                    layer.IsVisible = false;
                }
            }

psdImage.Save(renderedFile, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha });
            Console.WriteLine($"Smart object rendered with effects saved to {renderedFile}");
        }

Console.WriteLine("Smart object processing completed successfully.");
    }
}

코드가 수행하는 작업 단계별

  1. 경로 정의srcFile은 원본 PSD를 가리키고; contentFilerenderedFile은 두 개의 PNG 출력 파일입니다.
  2. 로드 옵션 구성LoadEffectsResource = true는 Aspose.PSD에 레이어 효과 리소스를 읽도록 알려 저장 시 렌더링될 수 있게 합니다.
  3. PSD 로드Image.Load는 일반 Image를 반환하고, PSD 전용 기능을 위해 PsdImage로 캐스팅합니다.
  4. 스마트 오브젝트 찾기 — 코드는 고정 인덱스를 가정하지 않고 is SmartObjectLayer로 모든 레이어를 검사합니다.
  5. 내장 콘텐츠 내보내기LoadContents는 스마트 오브젝트 자체 소스 이미지를 반환하고, 이를 RasterImage로 캐스팅한 뒤 PNG로 저장합니다.
  6. 격리 및 렌더링 — 다른 모든 레이어를 숨기고 전체 PsdImage를 저장하면 스마트 오브젝트만 포함된 평면 PNG가 생성되며, 효과가 적용됩니다.
  7. 리소스 정리using 블록은 외부 PsdImage와 내부 콘텐츠 이미지를 각각 사용이 끝나는 즉시 해제합니다.

무료 라이선스 받기

평가 목적으로 임시 무료 라이선스를 Aspose 무료 라이선스 페이지에서 얻을 수 있습니다. 라이선스는 평가 워터마크를 제거하고 자체 환경에서 스마트 오브젝트 워크플로를 테스트할 수 있게 합니다.

무료 추가 리소스

결론

PSD 파일에서 스마트 오브젝트와 그 효과를 처리하는 데 더 이상 수동 Photoshop 단계가 필요하지 않습니다. Aspose.PSD의 SmartObjectLayer, PsdLoadOptions.LoadEffectsResource, 및 Layer.IsVisible를 사용하면 .NET 개발자가 프로그래밍 방식으로 스마트 오브젝트 자체 콘텐츠를 추출하고 레이어 효과를 유지한 채 별도로 렌더링한 다음, 결과를 자동화된 파이프라인에 통합할 수 있습니다. 샘플 코드는 배치 처리, UI 도구 또는 서버 측 이미지 서비스에 맞게 조정할 수 있는 전체 워크플로를 보여줍니다.

FAQs

  1. Aspose.PSD에서 SmartObjectLayer란 무엇인가요? SmartObjectLayer는 PSD 파일 내부의 스마트 오브젝트 레이어를 나타냅니다. 이 레이어는 자체적으로 포함되거나 연결된 이미지 콘텐츠를 보유하고 있으며, 문서의 나머지 부분과 독립적으로 로드, 교체 또는 내보낼 수 있습니다.

  2. PSD를 로드할 때 효과를 유지하려면 옵션을 활성화해야 하나요?
    예 — PsdLoadOptions.LoadEffectsResourcetrue(네임스페이스 Aspose.PSD.ImageLoadOptions)로 설정하면 그림자와 글로우와 같은 지원되는 레이어 효과가 저장 시 최종 병합 이미지에 렌더링됩니다.

  3. 스마트 오브젝트를 일반 래스터 레이어로 프로그래밍 방식으로 변환할 수 있나요? SmartObjectProvider.ConvertToSmartObject 실제로는 반대 작업을 수행합니다 — 일반 레이어를 새로운 임베디드 스마트 오브젝트로 래핑합니다. 스마트 오브젝트에 적용된 효과가 포함된 평면 PNG를 얻으려면, 다른 레이어들의 Layer.IsVisiblefalse 로 설정하고 포함된 PsdImage 를 저장하십시오.

  4. 같은 PSD에서 여러 스마트 오브젝트를 처리할 수 있나요? 예 — psdImage.Layers를 순회하고, is SmartObjectLayer 패턴으로 각 레이어를 확인한 다음, 찾은 각 스마트 오브젝트에 대해 추출 및 렌더링 단계를 반복합니다.

  5. 스마트 오브젝트를 PNG로 저장할 때 투명성을 유지하기 위해 권장되는 이미지 형식은 무엇입니까? 전체 알파 채널 정보를 유지하려면 PngOptionsColorType = PngColorType.TruecolorWithAlpha를 사용하십시오.

  6. 프로덕션에서 샘플 코드를 실행하려면 라이선스가 필요합니까? 평가용으로는 임시 무료 라이선스면 충분하지만, 라이선스가 없을 경우 출력에 워터마크가 표시됩니다; 프로덕션 사용에는 전체 Aspose.PSD 라이선스가 필요합니다.

더 읽기