API를 통한 PSD 파일의 래스터 레이어 마스크 편집

개요

Adobe® Photoshop® 없이 PSD 형식을 자동화하고 PSD 파일을 변경하려면 아래 제공된 Aspose.PSD API를 사용할 수 있습니다. PSD 파일을 수정하는 데 도움이 되는 C# 및 .NET 코드 스니펫이 있습니다.

PSD 레이어 및 벡터 마스크를 사용하면 레이어 픽셀을 영구적으로 삭제하지 않고 숨기거나 보여줄 수 있습니다. 래스터 마스크는 레이어 마스크 또는 사용자 마스크라고도합니다. Aspose.PSD에서 래스터 및 벡터 마스크에 액세스하려면 ‘LayerMaskData’ 레이어 속성을 통해 제공됩니다. 이 속성은 추상 ‘LayerMaskData’ 클래스의 하위 클래스 인 ‘LayerMaskDataShort’ 및 ‘LayerMaskDataFull’ 클래스가 될 수 있습니다. 레이어에 래스터 및 벡터 마스크가 모두있는 경우 LayerMaskDataFull 인스턴스가 제공됩니다. 레이어에 래스터 또는 벡터 마스크만 있는 경우 LayerMaskDataShort 인스턴스가 제공됩니다. LayerMaskData 속성이 null이면 레이어에 마스크가 없거나 비활성화된 벡터 마스크만 있습니다.

할 일: 이미지 대체 텍스트

래스터 마스크 및 비활성화된 벡터 마스크 LayerMaskDataShort

비활성화된 래스터 마스크 LayerMaskDataShort

래스터 마스크 및 벡터 마스크 LayerMaskDataFull

래스터 마스크 LayerMaskDataShort

벡터 마스크 LayerMaskDataShort

비활성화된 벡터 마스크 없음 (그러나 벡터 리소스가 존재함)

PSD 파일에서 레이어 래스터 마스크를 가져오는 방법

먼저, 레이어에 벡터 및 레이어 마스크가 있는지 확인해야 합니다.

다음으로 제공된 샘플 코드는 레이어 래스터 마스크를 가져오는 방법을 보여줍니다.

LayerMaskDataFull fullMask = layer.LayerMaskData as LayerMaskDataFull;
if (fullMask != null)
{
var left = fullMask.EnclosingLeft;
var right = fullMask.EnclosingRight;
var top = fullMask.EnclosingTop;
var bottom = fullMask.EnclosingBottom;
var maskRectangle = fullMask.UserMaskRectangle;
var imageData = fullMask.UserMaskData;
var defaultColor = fullMask.BackgroundColor;
var flags = fullMask.RealFlags;
bool isDisabled = (flags & LayerMaskFlags.Disabled) != 0;
}

그렇지 않으면 LayerMaskData 레이어 속성의 타입은 LayerMaskDataShort입니다. 이 경우, 레이어가 래스터 마스크만 가지고 있는지 Flags 속성을 확인하여 확인해야 합니다. LayerMaskFlags UserMaskFromRenderingOtherData 플래그를 포함하면 마스크는 벡터 마스크 캐시입니다.

마스크 코드 스니펫 가져오기:

LayerMaskDataShort mask = (LayerMaskDataShort)layer.LayerMaskData;
if ((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) == 0)
{
var left = fullMask.Left;
var right = fullMask.Right;
var top = fullMask.Top;
var bottom = fullMask.Bottom;
var maskRectangle = mask.MaskRectangle;
var imageData = mask.ImageData;
var defaultColor = newMask.DefaultColor;
var flags = newMask.Flags;
bool isDisabled = (flags & LayerMaskFlags.Disabled) != 0;
}

양쪽 마스크가 존재할 때도 추가 조작을 위해 레이어 마스크를 LayerMaskDataShort로 추출해야하는 경우 LayerMaskDataFull을 추출하고 LayerMaskDataShort로 변환해야합니다. 다음 코드는 두 경우에 모두 사용할 수 있습니다:

PSD에서 래스터 마스크 추출

LayerMaskDataShort GetRasterMask(LayerMaskData mask)
{
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
return null;
}
if (fullMask != null)
{
return new LayerMaskDataShort()
{
Left = fullMask.EnclosingLeft,
Right = fullMask.EnclosingRight,
Top = fullMask.EnclosingTop,
Bottom = fullMask.EnclosingBottom,
ImageData = fullMask.UserMaskData,
DefaultColor = fullMask.DefaultColor,
Flags = fullMask.RealFlags
};
}

PSD 파일의 레이어에 래스터 마스크가 있는지 확인하는 방법

다음 C# 코드는 레이어에 래스터 마스크가 있는지 확인하는 데 도움이 될 수 있습니다:

PSD 레이어에 래스터 마스크가 적용되었는지 확인하는 방법

bool HasLayerRasterMask(Layer layer)
{
var mask = layer.LayerMaskData;
var fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
return false;
}
return true;
}

PSD 파일에서 레이어 래스터 마스크를 제거 / 추가 / 업데이트하는 방법

레이어 MaskData를 삭제 / 추가 / 업데이트하는 것만으로는 올바르게 저장하기에는 충분하지 않습니다. 채널이 업데이트되지 않습니다. 적절한 렌더링을 제공 할 수 있지만 마스크 채널이 변경되지 않습니다:

layer.LayerMaskData = newMaskData;

레이어 AddLayerMask 메서드를 사용하여 레이어 마스크를 제거 / 추가 / 업데이트해야합니다.

마스크 및 채널을 추가/업데이트합니다:

layer.AddLayerMask(newMaskData);

마스크 및 채널을 제거합니다.

PSD 이미지에서 레이어 래스터 마스크 제거

먼저 마스크가 전형적인 형식에 있는지 확인하고 벡터 마스크가 아닌 경우 래스터 마스크를 삭제하기 위해 null을 인수로 AddLayerMask 메서드를 호출할 수 있습니다. 그러나 전체 형식의 경우 이를 짧은 형식으로 변환하여 벡터 마스크 만 남겨야합니다. 레이어 마스크를 제거하는 데 다음 C# .NET 코드 스니펫을 사용할 수 있습니다:

PSD 파일에서 레이어 마스크 제거하는 코드 스니펫.

void RemoveRasterMask(Layer layer)
{
LayerMaskData mask = layer.LayerMaskData;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
throw new Exception("This layer has no raster mask.");
}
if (fullMask == null)
{
layer.AddLayerMask(null);
return;
}
var vectorMask = new LayerMaskDataShort();
vectorMask.Flags = fullMask.Flags;
vectorMask.MaskRectangle = fullMask.MaskRectangle;
vectorMask.DefaultColor = fullMask.DefaultColor;
vectorMask.ImageData = fullMask.ImageData;
layer.AddLayerMask(vectorMask);
}

PSD 이미지에서 레이어 래스터 마스크 업데이트

이것은 간단합니다. 형식이 짧은 형식인 경우 ImageData 및 MaskRectangle를 필요한 경우 변경해야하며, 그렇지 않으면 UserMaskDataUserMaskRectangle를 변경해야합니다. 레이어 마스크를 업데이트하는 데 사용할 수있는 다음 C# .NET 코드 스니펫은 다음과 같습니다:

C#로 PSD 레이어 마스크 업데이트

void RemoveRasterMask(Layer layer)
{
LayerMaskData mask = layer.LayerMaskData;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (mask == null ||
((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 && fullMask == null))
{
throw new Exception("This layer has no raster mask.");
}
if (fullMask == null)
{
layer.AddLayerMask(null);
return;
}
var vectorMask = new LayerMaskDataShort();
vectorMask.Flags = fullMask.Flags;
vectorMask.MaskRectangle = fullMask.MaskRectangle;
vectorMask.DefaultColor = fullMask.DefaultColor;
vectorMask.ImageData = fullMask.ImageData;
layer.AddLayerMask(vectorMask);
}

다음은 레이어 사용자 마스크를 반전시키는 가능한 조작의 예입니다:

C#로 PSD 레이어 마스크 업데이트

void InvertMask(LayerMaskData mask)
{
byte[] maskBytes;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
if (fullMask == null)
{
maskBytes = mask.ImageData;
}
else
{
maskBytes = fullMask.UserMaskData;
}
for (int i = 0; i < maskBytes.Length; i++)
{
maskBytes[i] = (byte)~maskBytes[i];
}
}

PSD 파일에서 레이어 래스터 마스크가 존재하는 경우 벡터 마스크 업데이트

사용자가 이미 벡터 경로 리소스를 변경했다고 가정합니다. 그럼 AddLayerMask 레이어 메서드를 호출하여 벡터 마스크를 쉽게 업데이트 할 수 ​​있습니다:

PSD 레이어 벡터 마스크 업데이트

void UpdateVectorMask(Layer layer)
{
var vectorMask = layer.LayerMaskData;
if (vectorMask == null || (vectorMask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) == 0)
{
throw new Exception("This layer has no vector mask.");
}
layer.AddLayerMask(vectorMask);
}

PSD 파일에 레이어 래스터 마스크 추가

레이어에 마스크가 없는 경우 AddLayerMask 레이어 메서드를 호출하여 주어진 래스터 마스크를 추가 할 수 있습니다.

마스크가 UserMaskFromRenderingOtherData** 플래그가없으면 이미 래스터 마스크가있기 때문에 방금 설명한대로 업데이트해야합니다. 그렇지 않으면 해당 마스크를 전체 형식으로 변환합니다. 그렇지 않으면 그대로 사용합니다. 그런 다음 UserMaskData, UserMaskRectangle 및 기타 속성을 주어진 마스크 속성으로 업데이트하십시오. 레이어 마스크를 추가 (업데이트)하는 데 사용할 수있는 다음 C# .NET 코드 스니펫은 다음과 같습니다:

PSD에 새로운 레이어 마스크 추가

void AddRasterMask(LayerMaskData mask, LayerMaskDataShort newShortMask)
{
LayerMaskData mask = layer.LayerMaskData;
LayerMaskDataFull fullMask = mask as LayerMaskDataFull;
var hasRasterMask = fullMask != null ||
(mask != null && (mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) == 0);
if (hasRasterMask)
{
Console.WriteLine("This layer has a raster mask already, updating.");
}
if (mask != null)
{
if (fullMask != null)
{
// let's update user raster mask in a full one.
fullMask.RealFlags = newMask.Flags;
fullMask.DefaultColor = newMask.DefaultColor;
fullMask.UserMaskRectangle = newMask.MaskRectangle;
fullMask.UserMaskData = newMask.ImageData;
newMask = fullMask;
}
else if ((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0)
{
// let's convert the short raster mask to a full one.
fullMask = new LayerMaskDataFull();
fullMask.Flags = mask.Flags;
fullMask.MaskRectangle = mask.MaskRectangle;
fullMask.ImageData = mask.ImageData;
fullMask.RealFlags = newMask.Flags;
fullMask.DefaultColor = newMask.DefaultColor;
fullMask.UserMaskRectangle = newMask.MaskRectangle;
fullMask.UserMaskData = newMask.ImageData;
newMask = fullMask;
}
}
// Adds or updates a mask
layer.AddLayerMask(newMask);
}

레이어 마스크가 활성화되었는지 확인하는 방법

레이어 래스터 마스크가 활성화 된 상태를 확인하기 위해 LayerMaskDataShort에있는 Flags 속성 또는 LayerMaskDataFull에있는 RealFlags에 대한 Flags 속성에서 LayerMaskFlags.Disabled 플래그 상태를 확인할 수 있습니다. 다음 C# .NET 코드 스니펫을 사용하여 레이어 마스크가 활성화 된 상태를 얻을 수 있습니다:

마스크가 활성화되었는지 확인:

bool GetRasterMaskState(Layer layer)
{
var mask = layer.LayerMaskData;
var fullMask = mask as LayerMaskDataFull;
if (mask == null || ((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 &&
fullMask == null))
{
throw new Exception("This layer has no raster mask.");
}
if (fullMask != null)
{
return (fullMask.RealFlags & LayerMaskFlags.Disabled) == 0;
}
else
{
return (mask.Flags & LayerMaskFlags.Disabled) == 0;
}
}

래스터 레이어 마스크를 활성화 또는 비활성화하는 방법

레이어 래스터 마스크를 활성화 또는 비활성화하려면 LayerMaskDataShort의 Flags 속성 또는 LayerMaskDataFull의 RealFlags에서 LayerMaskFlags.Disabled 플래그 상태를 변경할 수 있습니다. 다음 C# .NET 코드 스니펫은 레이어 마스크 활성화 상태를 변경하는 데 사용할 수 있습니다:

래스터 레이어 마스크 활성화 또는 비활성화:

void SetRasterMaskState(Layer layer, bool isEnabled)
{
var mask = layer.LayerMaskData;
var fullMask = mask as LayerMaskDataFull;
if (mask == null || ((mask.Flags & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0 &&
fullMask == null))
{
throw new Exception("This layer has no raster mask."));
}
if (fullMask != null)
{
if (isEnabled)
{
fullMask.RealFlags = fullMask.RealFlags & ~LayerMaskFlags.Disabled;
}
else
{
fullMask.RealFlags = fullMask.RealFlags | LayerMaskFlags.Disabled;
}
}
else
{
{
if (isEnabled)
{
mask.Flags = mask.Flags & ~LayerMaskFlags.Disabled;
}
else
{
mask.Flags = mask.Flags | LayerMaskFlags.Disabled;
}
}
}
}