Редактиране на маски на растерен слой в 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); |
Това премахва както маската, така и каналите:
layer.AddLayerMask(null); |
Премахване на растерна маска на слой в изображението 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; | |
} | |
} | |
} | |
} |