PSD Dosyasında API Aracılığıyla Raster Katman Maskelerini Düzenleme

Genel Bakış

PSD formatını otomatikleştirmek ve Adobe® Photoshop® kullanmadan PSD dosyasını değiştirmek için aşağıdaki Aspose.PSD API’sini kullanabilirsiniz. PSD dosyalarını değiştirmenize yardımcı olabilecek C# ve .NET kod parçaları bulunmaktadır.

PSD Katman ve Vektör Maskeleri kullanarak katman piksellerini kalıcı olarak silmeden gizleyebilir ve gösterebiliriz. Raster maskeleri aynı zamanda bir katman maskesi veya kullanıcı maskesi olarak da adlandırılır. Aspose.PSD’de hem raster hem de vektör maskelerine LayerMaskData katman özelliğinden erişim sağlanır, bu özellik ‘LayerMaskDataShort’ ve ‘LayerMaskDataFull’ sınıfları olabilir. Bu sınıflar soyut ‘LayerMaskData’ sınıfının çocuk sınıflarıdır. Bir katman hem raster hem de vektör maskelere sahipse, LayerMaskDataFull nelimi verilir. Bir katman sadece raster veya vektör maskesine sahipse, LayerMaskDataShort nelimi verilir. Eğer LayerMaskData özelliği null ise, katmanda maskeler yoktur veya sadece devre dışı bırakılmış bir vektör maskesi vardır.

todo:image_alt_text

Bir raster maske ve devre dışı bırakılmış bir vektör maske LayerMaskDataShort

Bir devre dışı bırakılmış raster maske  LayerMaskDataShort

Bir raster maske ve bir vektör maske  LayerMaskDataFull

Bir raster maske  LayerMaskDataShort

Bir vektör maske  LayerMaskDataShort

Bir devre dışı bırakılmış vektör maske yok (Ancak vektör kaynağı mevcut)

PSD dosyasında bir katman raster maskesini nasıl alabiliriz?

Öncelikle, bir katmanda hem vektör hem de katman maskesinin olup olmadığını bulmalıyız:

Aşağıdaki örnek kod, bir katman raster maskesini nasıl alacağını göstermektedir.

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;
}

Aksi takdirde, LayerMaskData katman özelliğinin türü LayerMaskDataShort olacaktır. Bu durumda, katmanın sadece bir raster maskesi olup olmadığını Flags özelliğini kontrol ederek kontrol edelim. Maskenin LayerMaskFlagsı içermemesi gerekmektedir.UserMaskFromRenderingOtherData bayrağı, aksi takdirde maske bir vektör maske önbelleğitir.

Maske kod parçacığı alımı:

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;
}

Eğer ihtiyaç duyarsanız bir raster maske çıkarma işlemi için LayerMaskDataShort olarak (daha fazla işlem yapmak için) her iki maske varken bile LayerMaskDataFull alınmalı ve LayerMaskDataShort’a dönüştürülmelidir. Aşağıdaki kod her iki durumda da kullanılabilir:

PSD’den bir raster maske çıkarma

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 dosyasında bir katmanda raster maske olup olmadığını nasıl kontrol edebiliriz?

Aşağıdaki C# kodu, bir katmanda raster maskesinin olup olmadığını kontrol etmenize yardımcı olabilir:

Raster maske uygulanıp uygulanmadığını nasıl öğreniriz? PSD Katmanı

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 dosyasında bir katman raster maskesini kaldırma / ekleme / güncelleme işlemi

Sadece LayerMaskData’ı kaldırmak / eklemek / güncellemek yeterli olmaz, çünkü kanallar güncellenmez; ancak doğru saydam olabilir. Bu, maske kanallarını değiştirmez:

layer.LayerMaskData = newMaskData;

Kaldırmak / eklemek / güncellemek için katmanın AddLayerMask yöntemini kullanmalıyız.

Bu hem maskenin hem de kanalların eklenmesini / güncellemeyi sağlar:

layer.AddLayerMask(newMaskData);

Bu hem maskenin hem de kanalların silinmesini sağlar:

PSD görüntüsünde bir katman raster maskesini kaldırma

Öncelikle, maske kısa biçimindeyse ve vektör değilse sadece raster maskesini silmek için AddLayerMask yöntemini çağırabiliriz. Ancak tam biçimindeyse, bu durumda onu kısa biçime dönüştürmeli ve vektör maskesini yalnız bırakmalıdır. Bir katman maskesini kaldırmak için aşağıdaki C# .NET kod parçacığı kullanılabilir:

PSD Dosyasından Katman Maskesini Kaldırma kod parçası.

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 görüntüsünde bir katman raster maskesini güncelleme

Bu basit bir işlemdir: kısa biçimdeki maskenin ImageData ve MaskRectangle’ı gerekiyorsa değiştirmemiz gerekir, aksi takdirde UserMaskData ve UserMaskRectangle değiştirilmelidir. Aşağıdaki C# .NET kod parçacığı, bir katman maskesini güncellemede kullanılabilir:

C# ile PSD Katman Maskesini Güncelleme

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

İşte bir katman kullanıcı maskesini ters çeviren olası eylemlerden bir örnek:

C# ile PSD Katman Maskesini Güncelleme

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 dosyasında bir katmanda raster maske varken bir vektör maskesini nasıl güncelleriz?

Kullanıcı zaten bir vektör yol kaynağını değiştirmiştir varsayılır. Ardından, vektör maskesini AddLayerMask katman yöntemini çağırarak güncelleyebilir:

PSD Katmanı Vektör Maskesini C# ile Güncelleme

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 dosyasında bir katmanda raster maske eklemek

Eğer bir katmanda maske yoksa, verilen raster maskesini AddLayerMask katman yöntemini çağırarak kolayca ekleyebiliriz.

Eğer maskenin UserMaskFromRenderingOtherData** bayrağı yoksa zaten bir raster maskesi vardır ve yukarıda açıklandığı gibi güncellememiz gerekir. Aksi takdirde, eğer bu maske kısa bir formatta ise onu tam biçime dönüştürürüz. Değilse olduğu gibi kullanırız. Daha sonra UserMaskData, UserMaskRectangle ve verilen maske özellikleri diğer özelliklerle güncellenir. Bir (güncelleme) katman maskesi eklemek için aşağıdaki C# .NET kod parçacığı kullanılabilir:

PSD’ye Yeni Katman Maske Ekleme

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

Bir katman maskesinin etkin olup olmadığını nasıl kontrol ederiz?

Katman raster maskesinin etkin olma durumunu bulmak için, LayerMaskDataShort için Flags özelliğinde veya LayerMaskDataFull için RealFlags özelliklerinde LayerMaskFlags.Disabled bayrağı durumunu kontrol edebiliriz. Bir katman maskesinin etkin durumunu almak için aşağıdaki C# .NET kod parçacığı kullanılabilir:

Bir maskenin etkin olup olmadığını kontrol edin:

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;
}
}

Bir raster katman maskesini etkinleştirmek veya devre dışı bırakmak için

Bir katman raster maskesini etkinleştirmek veya devre dışı bırakmak için, LayerMaskDataShort için Flags özelliğinde veya LayerMaskDataFull için RealFlags özelliğinde LayerMaskFlags.Disabled bayrağı durumunu değiştirebiliriz. Bir katman maskesinin etkin durumunu değiştirmek için aşağıdaki C# .NET kod parçacığı kullanılabilir:

Raster Katman Maskesini Etkinleştir veya Devre Dışı Bırak:

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;
}
}
}
}