Редактиране на маски на растерен слой в PSD файл чрез API

Преглед

За автоматизиране на редакцията на формат PSD и промяната на PSD файл без Adobe® Photoshop®, можете да използвате API на Aspose.PSD, предоставен по-долу. Има C# и .NET кодови откъски, които могат да ви помогнат да промените PSD файлове.

С използване на PSD маски на слоеве и векторни маски сме в състояние да скриваме и показваме пиксели на слоя, без да ги изтриваме перманентно. Растерните маски се наричат също слойна маска или потребителска маска. Достъпът до и двете растерни и векторни маски в Aspose.PSD се осъществява чрез свойството на слоя LayerMaskData, което може да е инстанция на класовете ‘LayerMaskDataShort’ и ‘LayerMaskDataFull’, които са детски класове на абстрактния клас ‘LayerMaskData’. Ако слоят има и растерни, и векторни маски, тогава се предоставя инстанция на LayerMaskDataFull . Ако слоят има само растерна или векторна маска, тогава се предоставя инстанция LayerMaskDataShort . Ако свойството LayerMaskData е нулево, то тогава слоят няма маски или има само деактивирана векторна маска.

текст на алт. картинката

Растерна маска и деактивирана векторна маска LayerMaskDataShort

Деактивирана растерна маска  LayerMaskDataShort

Растерна маска и векторна маска  LayerMaskDataFull

Растерна маска  LayerMaskDataShort

Векторна маска  LayerMaskDataShort

Деактивирана векторна маска null (Но векторният ресурс е налице)

Как да получите растерната маска на слоя в 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 файла?

Просто премахването / добавянето / актуализирането на LayerMaskData не е достатъчно за правилно запазване, тъй като каналите не се актуализират; въпреки че може да осигури правилно изкарване. Това не променя каналите на маската:

layer.LayerMaskData = newMaskData;

Трябва да използваме метода AddLayerMask на слоя за премахване / добавяне / актуализиране.

Това добавя/актуализира както маската, така и каналите:

layer.AddLayerMask(newMaskData);

Това премахва както маската, така и каналите:

Премахване на растерна маска на слой в изображението PSD

Първоначално проверяваме дали маската е в кратък формат и ако не е векторна, можем просто да извикаме метода 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 при необходимост, в противен случай UserMaskData и UserMaskRectangle трябва да бъдат променени. Следният C# .NET кодов откъс може да се използва за актуализиране на маска на слоя:

Актуализиране на PSD маската на слоя с C#.

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 маската на слоя с C#.

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 Layer Vector Mask с C#.

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** флаг, тогава вече има растерна маска и трябва да я актуализираме, както е описано по-горе. В противен случай, ако тази маска е в кратък формат, я преобразуваме в пълен формат. Ако не, я използваме каквато е. Следният 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);
}

Как да проверите дали маската на слоя е активирана?

За да разберете дали маската на слоя е активирана, можем да проверим състоянието на флага LayerMaskFlags.Disabled в свойството Flags за LayerMaskDataShort или в RealFlags за LayerMaskDataFull. Следният 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;
}
}

Как да активирате или деактивирате растерна маска на слоя?

За да активирате или деактивирате растерна маска на слоя, можем да променим състоянието на флага LayerMaskFlags.Disabled в свойството Flags за LayerMaskDataShort или в RealFlags за LayerMaskDataFull. Следният 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;
}
}
}
}