PSDファイルを使用してAPI経由でラスターレイヤーマスクを編集する

概要

Adobe® Photoshop®を使用せずにPSD形式の編集とPSDファイルの変更を自動化するには、以下で提供されるAspose.PSD APIを使用できます。PSDファイルを変更するのに役立つC#および.NETコードスニペットがあります。

Aspose.PSDでは、PSDのレイヤーマスクとベクトルマスクを使用して、レイヤーピクセルを永久的に削除することなく非表示および表示することができます。ラスターマスクはレイヤーマスクまたはユーザーマスクとも呼ばれます。Aspose.PSDでのラスターマスクとベクトルマスクの両方へのアクセスは、LayerMaskDataレイヤープロパティを介して提供され、これは’LayerMaskData’クラスの抽象クラスの子クラスである'LayerMaskDataShort‘および’LayerMaskDataFull‘クラスのインスタンスである可能性があります。レイヤーにラスターマスクとベクトルマスクの両方がある場合、LayerMaskDataFullインスタンスが提供されます。レイヤーにラスターマスクまたはベクトルマスクのみが含まれる場合、LayerMaskDataShortインスタンスが提供されます。LayerMaskDataプロパティがnullの場合、レイヤーにマスクがないか、無効になっているベクトルマスクのみがあります。

todo:image_alt_text

ラスターマスクおよび無効なベクトルマスク 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プロパティをチェックしてレイヤーにラスターマスクのみがあるかどうかを確認します。FlagsプロパティはLayerMaskFlagsを含んでいてはならず、そうでない場合はマスクがベクトルマスクキャッシュである可能性があります。

マスクコードスニペットの取得:

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

両方のマスクが存在する場合でも、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レイヤー

PSDファイル内のレイヤーラスターマスクを削除/追加/更新する方法

正しく保存するには、単にLayerMaskDataを削除/追加/更新しても十分ではありません。チャネルが更新されないため,正しいレンダリングは可能かもしれませんが,これによりマスクチャネルは変更されません。

削除/追加/更新するために、レイヤーにAddLayerMaskメソッドを使用する必要があります。

これにより、マスクとチャネルの両方が追加/更新されます。

layer.LayerMaskData = newMaskData;

これにより、マスクとチャネルの両方が削除されます。

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を必要に応じて変更する必要があります。それ以外の場合は、UserMaskDataおよびUserMaskRectangleを変更する必要があります。次の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レイヤーメソッドを呼び出すだけで、ベクトルマスクを更新することができます。

C#で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**フラグがない場合、既にラスターマスクが含まれているため、上記のように更新する必要があります。そうでない場合は、短いフォーマットからフルフォーマットに変換します。そうでない場合はそのまま使用します。次の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で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;
}
}
}
}