SmartObjectLayer.NewSmartObjectViaCopy
Contents
[
Hide
]SmartObjectLayer.NewSmartObjectViaCopy method
Creates a new smart object layer by coping this one. Reproduces Layer -> Smart Objects -> New Smart Object via Copy
functionality of Adobe� Photoshop�. Notice that it is enabled only for embedded smart objects because the embedded image is also copied. If you want to share the embedded image use DuplicateLayer
method.
public SmartObjectLayer NewSmartObjectViaCopy()
Return Value
The cloned SmartObjectLayer
instance.
Examples
These examples demonstrate how to copy smart object layers in a PSD image.
[C#]
string dataDir = baseFolder + Path.DirectorySeparatorChar;
string outputDir = dataDir + "output" + Path.DirectorySeparatorChar;
// These examples demonstrate how to copy smart object layers in a PSD image.
ExampleOfCopingSmartObjectLayer("r-embedded-psd");
ExampleOfCopingSmartObjectLayer("r-embedded-png");
ExampleOfCopingSmartObjectLayer("r-embedded-transform");
ExampleOfCopingSmartObjectLayer("new_panama-papers-8-trans4");
void ExampleOfCopingSmartObjectLayer(string fileName)
{
int layerNumber = 0; // The layer number to copy
string filePath = dataDir + fileName + ".psd";
string outputFilePath = outputDir + fileName + "_copy_" + layerNumber;
string pngOutputPath = outputFilePath + ".png";
string psdOutputPath = outputFilePath + ".psd";
using (PsdImage image = (PsdImage)Image.Load(filePath))
{
var smartObjectLayer = (SmartObjectLayer)image.Layers[layerNumber];
var newLayer = smartObjectLayer.NewSmartObjectViaCopy();
newLayer.IsVisible = false;
AssertIsTrue(object.ReferenceEquals(newLayer, image.Layers[layerNumber + 1]));
AssertIsTrue(object.ReferenceEquals(smartObjectLayer, image.Layers[layerNumber]));
var duplicatedLayer = smartObjectLayer.DuplicateLayer();
duplicatedLayer.DisplayName = smartObjectLayer.DisplayName + " shared image";
AssertIsTrue(object.ReferenceEquals(newLayer, image.Layers[layerNumber + 2]));
AssertIsTrue(object.ReferenceEquals(duplicatedLayer, image.Layers[layerNumber + 1]));
AssertIsTrue(object.ReferenceEquals(smartObjectLayer, image.Layers[layerNumber]));
using (var innerImage = (RasterImage)smartObjectLayer.LoadContents(null))
{
// Let's invert the embedded smart object image (for an inner PSD image we invert only its first layer)
InvertImage(innerImage);
// Let's replace the embedded smart object image in the PSD layer
smartObjectLayer.ReplaceContents(innerImage);
}
// The duplicated layer shares its imbedded image with the original smart object
// and it should be updated explicitly otherwise its rendering cache remains unchanged.
// We update every smart object to make sure that the new layer created by NewSmartObjectViaCopy
// does not share the embedded image with the others.
image.SmartObjectProvider.UpdateAllModifiedContent();
image.Save(pngOutputPath, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
image.Save(psdOutputPath, new PsdOptions(image));
}
}
// Inverts the raster image including the PSD image.
void InvertImage(RasterImage innerImage)
{
var innerPsdImage = innerImage as PsdImage;
if (innerPsdImage != null)
{
InvertRasterImage(innerPsdImage.Layers[0]);
}
else
{
InvertRasterImage(innerImage);
}
}
// Inverts the raster image.
void InvertRasterImage(RasterImage innerImage)
{
var pixels = innerImage.LoadArgb32Pixels(innerImage.Bounds);
for (int i = 0; i < pixels.Length; i++)
{
var pixel = pixels[i];
var alpha = (int)(pixel & 0xff000000);
pixels[i] = (~(pixel & 0x00ffffff)) | alpha;
}
innerImage.SaveArgb32Pixels(innerImage.Bounds, pixels);
}
void AssertIsTrue(bool condition)
{
if (!condition)
{
throw new FormatException(string.Format("Expected true"));
}
}
See Also
- class SmartObjectLayer
- namespace Aspose.PSD.FileFormats.Psd.Layers.SmartObjects
- assembly Aspose.PSD