Class SmartObjectLayer

SmartObjectLayer class

Defines the SmartObjectLayer class that contains embedded in the PSD file or linked smart object in the external file. With Smart Objects, you can: Perform nondestructive transforms. You can scale, rotate, skew, distort, perspective transform, or warp a layer without losing original image data or quality because the transforms don�t affect the original data. Work with vector data, such as vector artwork from Illustrator, that otherwise would be rasterized. Perform nondestructive filtering. You can edit filters applied to Smart Objects at any time. Edit one Smart Object and automatically update all its linked instances. Apply a layer mask that�s either linked or unlinked to the Smart Object layer. Try various designs with low-resolution placeholder images that you later replace with final versions. In Adobe� Photoshop�, you can embed the contents of an image into a PSD document. More information is here: https://helpx.adobe.com/photoshop/using/create-smart-objects.html A layer with an embedded smart object contains placed (PlLd) and SoLd resources with smart object properties. The PlLd resource can be alone for PSD versions older then 10. These resources contain UniqueId of the LiFdDataSource in the global Lnk2Resource with the embedded filename and other parameters, including the embedded file contents in the original format as a byte array.

public class SmartObjectLayer : Layer

Constructors

NameDescription
SmartObjectLayer(Stream)Initializes a new instance of the SmartObjectLayer class.

Properties

NameDescription
AutoAdjustPalette { get; set; }Gets or sets a value indicating whether automatic adjust palette.
virtual BackgroundColor { get; set; }Gets or sets a value for the background color.
override BitsPerPixel { get; }Gets the image bits per pixel count.
BlendClippedElements { get; set; }Gets or sets the blending of clipped element.
BlendingOptions { get; }Gets the blending options.
virtual BlendModeKey { get; set; }Gets or sets the blend mode key.
BlendModeSignature { get; }Gets the blend mode signature.
virtual Bottom { get; set; }Gets or sets the bottom layer position.
Bounds { get; }Gets the image bounds.
BufferSizeHint { get; set; }Gets or sets the buffer size hint which is defined max allowed size for all internal buffers.
ChannelInformation { get; set; }Gets or sets the channel information.
ChannelsCount { get; }Gets the layer’s channels count.
Clipping { get; set; }Gets or sets the layer clipping. 0 = base, 1 = non-base.
Container { get; }Gets the Image container.
Contents { get; set; }Gets or sets the smart object layer contents. The embedded smart object contents is the embedded raw image file: Data and its properties. The linked smart object contents is the raw content of the linked image file if it is available and its properties: LiFeDataSource. We do not support loading from the Adobe� Photoshop� �� Graphics Library when IsLibraryLink is true. For regular link files, at first, we use RelativePath to look for the file relatively to the source image path SourceImagePath, if it is not available we look at FullPath, if not then we look for the link file in the same directory where our image is: SourceImagePath.
ContentsBounds { get; set; }Gets or sets the smart object content’s bounds.
ContentsSource { get; set; }Gets or sets the smart object content’s source.
ContentType { get; }Gets the type of the smart object layer content. The embedded smart object contents is the embedded raw image file: Data. The linked smart object contents is the raw contents of the linked image file if it is available: LiFeDataSource. We do not support loading from the Adobe� Photoshop� �� Graphics Library when IsLibraryLink is true. For regular link files, at first, we use RelativePath to look for the file relatively to the source image path SourceImagePath, if it is not available we look at FullPath, if not then we look for the link file in the same directory where our image is: SourceImagePath.
DataStreamContainer { get; }Gets the object’s data stream.
DisplayName { get; set; }Gets or sets the display name of the layer.
Disposed { get; }Gets a value indicating whether this instance is disposed.
ExtraLength { get; }Gets the layer extra information length in bytes.
virtual FileFormat { get; }Gets a value of file format
Filler { get; set; }Gets or sets the layer filler.
FillOpacity { get; set; }Gets or sets the fill opacity.
Flags { get; set; }Gets or sets the layer flags. bit 0 = transparency protected; bit 1 = visible; bit 2 = obsolete; bit 3 = 1 for Photoshop 5.0 and later, tells if bit 4 has useful information; bit 4 = pixel data irrelevant to appearance of document.
override HasAlpha { get; }Gets a value indicating whether this instance has alpha.
virtual HasBackgroundColor { get; set; }Gets or sets a value indicating whether image has background color.
virtual HasTransparentColor { get; set; }Gets a value indicating whether image has transparent color.
override Height { get; }Gets the image height.
virtual HorizontalResolution { get; set; }Gets or sets the horizontal resolution, in pixels per inch, of this RasterImage.
virtual ImageOpacity { get; }Gets opacity of this image.
InterruptMonitor { get; set; }Gets or sets the interrupt monitor.
override IsCached { get; }Gets a value indicating whether image data is cached currently.
IsRawDataAvailable { get; }Gets a value indicating whether raw data loading is available.
IsVisible { get; set; }Gets or sets a value indicating whether the layer is visible
virtual IsVisibleInGroup { get; }Gets a value indicating whether this instance is visible in group(If layer is not in group it means root group).
LayerBlendingRangesData { get; set; }Gets or sets the layer blending ranges data.
LayerCreationDateTime { get; set; }Gets or sets the layer creation date time.
LayerLock { get; set; }Gets or sets the layer lock. Note that if flag LayerFlags.TransparencyProtected is set it will be overwritten by layer lock flag. To return LayerFlags.TransparencyProtected flag need to apply for layer option layer.Flags |= LayerFlags.TransparencyProtected
LayerMaskData { get; set; }Gets or sets the layer mask data.
LayerOptions { get; }Gets the layer options.
virtual Left { get; set; }Gets or sets the left layer position.
Length { get; }Gets the overall layer length in bytes.
Name { get; set; }Gets or sets the layer name.
Opacity { get; set; }Gets or sets the layer opacity. 0 = transparent, 255 = opaque.
Palette { get; set; }Gets or sets the color palette. The color palette is not used when pixels are represented directly.
virtual PremultiplyComponents { get; set; }Gets or sets a value indicating whether the image components must be premultiplied.
RawCustomColorConverter { get; set; }Gets or sets the custom color converter
virtual RawDataFormat { get; }Gets the raw data format.
RawDataSettings { get; }Gets the current raw data settings. Note when using these settings the data loads without conversion.
RawFallbackIndex { get; set; }Gets or sets the fallback index to use when palette index is out of bounds
RawIndexedColorConverter { get; set; }Gets or sets the indexed color converter
virtual RawLineSize { get; }Gets the raw line size in bytes.
Resources { get; set; }Gets or sets the layer resources.
virtual Right { get; set; }Gets or sets the right layer position.
SheetColorHighlight { get; set; }Gets or sets the decorative sheet color highlight in layers’ list
Size { get; }Gets the image size.
SmartFilters { get; }Gets the smart filters.
SmartObjectProvider { get; }Gets the smart object provider.
virtual Top { get; set; }Gets or sets the top layer position.
virtual TransparentColor { get; set; }Gets the image transparent color.
virtual UpdateXmpData { get; set; }Gets or sets a value indicating whether to update the XMP metadata.
virtual UsePalette { get; }Gets a value indicating whether the image palette is used.
virtual UseRawData { get; set; }Gets or sets a value indicating whether to use raw data loading when the raw data loading is available.
virtual VerticalResolution { get; set; }Gets or sets the vertical resolution, in pixels per inch, of this RasterImage.
WarpSettings { get; set; }It gets or sets Warp parameters that was set or get from resource (default)
override Width { get; }Gets the image width.
virtual XmpData { get; set; }Gets or sets the XMP metadata.

Methods

NameDescription
AddLayerMask(LayerMaskData)Adds the mask to current layer.
override AdjustBrightness(int)Adjust of a brightness for image.
override AdjustContrast(float)Image contrasting
override AdjustGamma(float)Gamma-correction of an image.
override AdjustGamma(float, float, float)Gamma-correction of an image.
override BinarizeBradley(double)Binarization of an image using Bradley’s adaptive thresholding algorithm using the integral image thresholding
override BinarizeBradley(double, int)Binarization of an image using Bradley’s adaptive thresholding algorithm using the integral image thresholding
override BinarizeFixed(byte)Binarization of an image with predefined threshold
override BinarizeOtsu()Binarization of an image with Otsu thresholding
override CacheData()Caches the data and ensures no additional data loading will be performed from the underlying DataStreamContainer.
CanSave(ImageOptionsBase)Determines whether image can be saved to the specified file format represented by the passed save options.
ConvertToLinked(string)Converts this embedded smart object to a linked smart object.
override Crop(Rectangle)Cropping the image.
virtual Crop(int, int, int, int)Crop image with shifts.
Dispose()Disposes the current instance.
Dither(DitheringMethod, int)Performs dithering on the current image.
override Dither(DitheringMethod, int, IColorPalette)Performs dithering on the current image.
DrawImage(Point, RasterImage)Draws the image on layer.
DuplicateLayer()Creates a new smart object layer by coping this one. Notice that for embedded smart objects the embedded image is shared. If you want to copy the embedded image use NewSmartObjectViaCopy method.
EmbedLinked()Embeds the linked smart object in this layer.
ExportContents(string)Exports the embedded or linked contents to a file.
virtual Filter(Rectangle, FilterOptionsBase)Filters the specified rectangle.
GetArgb32Pixel(int, int)Gets an image 32-bit ARGB pixel.
GetDefaultArgb32Pixels(Rectangle)Gets the default 32-bit ARGB pixels array.
virtual GetDefaultOptions(object[])Gets the default options.
GetDefaultPixels(Rectangle, IPartialArgb32PixelLoader)Gets the default pixels array using partial pixel loader.
GetDefaultRawData(Rectangle, RawDataSettings)Gets the default raw data array.
GetDefaultRawData(Rectangle, IPartialRawDataLoader, RawDataSettings)Gets the default raw data array using partial pixel loader.
override GetHashCode()Returns a hash code for this instance.
virtual GetModifyDate(bool)Gets the date and time the resource image was last modified.
virtual GetOriginalOptions()Gets the options based on the original file settings. This can be helpful to keep bit-depth and other parameters of the original image unchanged. For example, if we load a black-white PNG image with 1 bit per pixel and then save it using the Save method, the output PNG image with 8-bit per pixel will be produced. To avoid it and save PNG image with 1-bit per pixel, use this method to get corresponding saving options and pass them to the Save method as the second parameter.
GetPixel(int, int)Gets an image pixel. Performance Warning: Avoid using this method to iterate over all image pixels as it can lead to significant performance issues. For more efficient pixel manipulation, use the LoadArgb32Pixels method to retrieve the entire pixel array simultaneously.
GetSkewAngle()Gets the skew angle. This method is applicable to scanned text documents, to determine the skew angle when scanning.
override Grayscale()Transformation of an image to its grayscale representation
LoadArgb32Pixels(Rectangle)Loads 32-bit ARGB pixels.
LoadArgb64Pixels(Rectangle)Loads 64-bit ARGB pixels.
LoadCmyk32Pixels(Rectangle)Loads pixels in CMYK format.
LoadCmykPixels(Rectangle)Loads pixels in CMYK format. This method is deprecated. Please use more effective the LoadCmyk32Pixels method.
LoadContents(LoadOptions)Gets the embedded or linked image contents of the smart object layer.
LoadPartialArgb32Pixels(Rectangle, IPartialArgb32PixelLoader)Loads 32-bit ARGB pixels partially by packs.
LoadPartialPixels(Rectangle, IPartialPixelLoader)Loads pixels partially by packs.
LoadPixels(Rectangle)Loads pixels.
LoadRawData(Rectangle, RawDataSettings, IPartialRawDataLoader)Loads raw data.
LoadRawData(Rectangle, Rectangle, RawDataSettings, IPartialRawDataLoader)Loads raw data.
virtual MergeLayerTo(Layer)Merges the layer to specified layer
NewSmartObjectViaCopy()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.
NormalizeAngle()Normalizes the angle. This method is applicable to scanned text documents to get rid of the skewed scan. This method uses GetSkewAngle and Rotate methods.
virtual NormalizeAngle(bool, Color)Normalizes the angle. This method is applicable to scanned text documents to get rid of the skewed scan. This method uses GetSkewAngle and Rotate methods.
ReadArgb32ScanLine(int)Reads the whole scan line by the specified scan line index.
ReadScanLine(int)Reads the whole scan line by the specified scan line index.
RelinkToFile(string)Re-links the linked smart object to a new file. There is no need to call UpdateModifiedContent method afterwards.
ReplaceColor(Color, byte, Color)Replaces one color to another with allowed difference and preserves original alpha value to save smooth edges.
virtual ReplaceColor(int, byte, int)Replaces one color to another with allowed difference and preserves original alpha value to save smooth edges.
ReplaceContents(Image)Replaces the smart object contents embedded in the smart object layer.
ReplaceContents(string)Replaces the contents with a file. There is no need to call UpdateModifiedContent method afterwards.
ReplaceContents(Image, ResolutionSetting)Replaces the smart object contents embedded in the smart object layer.
ReplaceContents(string, ResolutionSetting)Replaces the contents with a file. There is no need to call UpdateModifiedContent method afterwards.
ReplaceNonTransparentColors(Color)Replaces all non-transparent colors with new color and preserves original alpha value to save smooth edges. Note: if you use it on images without transparency, all colors will be replaced with a single one.
virtual ReplaceNonTransparentColors(int)Replaces all non-transparent colors with new color and preserves original alpha value to save smooth edges. Note: if you use it on images without transparency, all colors will be replaced with a single one.
Resize(int, int)Resizes the image. The default NearestNeighbourResample is used.
override Resize(int, int, ImageResizeSettings)Resizes the image.
override Resize(int, int, ResizeType)Resizes the image.
ResizeHeightProportionally(int)Resizes the height proportionally.
virtual ResizeHeightProportionally(int, ImageResizeSettings)Resizes the height proportionally.
virtual ResizeHeightProportionally(int, ResizeType)Resizes the height proportionally.
ResizeWidthProportionally(int)Resizes the width proportionally. The default NearestNeighbourResample is used.
virtual ResizeWidthProportionally(int, ImageResizeSettings)Resizes the width proportionally.
virtual ResizeWidthProportionally(int, ResizeType)Resizes the width proportionally.
virtual Rotate(float)Rotate image around the center.
override Rotate(float, bool, Color)Rotate image around the center.
override RotateFlip(RotateFlipType)Rotates, flips, or rotates and flips the image.
Save()Saves the image data to the underlying stream.
override Save(Stream)Saves the object’s data to the specified stream.
Save(string)Saves the object’s data to the specified file location.
Save(Stream, ImageOptionsBase)Saves the image’s data to the specified stream in the specified file format according to save options.
override Save(string, bool)Saves the object’s data to the specified file location.
override Save(string, ImageOptionsBase)Saves the object’s data to the specified file location in the specified file format according to save options.
override Save(Stream, ImageOptionsBase, Rectangle)Saves the image’s data to the specified stream in the specified file format according to save options.
override Save(string, ImageOptionsBase, Rectangle)Saves the object’s data to the specified file location in the specified file format according to save options.
SaveArgb32Pixels(Rectangle, int[])Saves the 32-bit ARGB pixels.
SaveCmyk32Pixels(Rectangle, int[])Saves the pixels.
SaveCmykPixels(Rectangle, CmykColor[])Saves the pixels. This method is deprecated. Please use more effective the SaveCmyk32Pixels method.
SavePixels(Rectangle, Color[])Saves the pixels.
SaveRawData(byte[], int, Rectangle, RawDataSettings)Saves the raw data.
SetArgb32Pixel(int, int, int)Sets an image 32-bit ARGB pixel for the specified position.
override SetPalette(IColorPalette, bool)Sets the image palette.
SetPixel(int, int, Color)Sets an image pixel for the specified position.
virtual SetResolution(double, double)Sets the resolution for this RasterImage.
ShallowCopy()Creates a shallow copy of the current Layer. Please https://msdn.microsoft.com/ru-ru/library/system.object.memberwiseclone(v=vs.110).aspx for explanation.
virtual ToBitmap()Converts raster image to the bitmap.
UpdateModifiedContent()Updates the smart object layer image cache with the modified content.
WriteArgb32ScanLine(int, int[])Writes the whole scan line to the specified scan line index.
WriteScanLine(int, Color[])Writes the whole scan line to the specified scan line index.

Examples

The following code demonstrates the support of Embedded Smart objects.

[C#]

void AssertAreEqual(object actual, object expected)
{
    if (!object.Equals(actual, expected))
    {
        throw new FormatException(string.Format("Actual value {0} are not equal to expected {1}.", actual, expected));
    }
}

// This example demonstrates how to change the smart object layer in the PSD file and export / update smart object original embedded contents.
const int left = 0;
const int top = 0;
const int right = 0xb;
const int bottom = 0x10;
FileFormat[] formats = new[]
{
    FileFormat.Png, FileFormat.Psd, FileFormat.Bmp, FileFormat.Jpeg, FileFormat.Gif, FileFormat.Tiff, FileFormat.Jpeg2000
};
foreach (FileFormat format in formats)
{
    string formatString = format.ToString().ToLowerInvariant();
    string formatExt = format == FileFormat.Jpeg2000 ? "jpf" : formatString;
    string fileName = "r-embedded-" + formatString;
    string sourceFilePath = fileName + ".psd";
    string pngOutputPath = fileName + "_output.png";
    string psdOutputPath = fileName + "_output.psd";
    string png2OutputPath = fileName + "_updated.png";
    string psd2OutputPath = fileName + "_updated.psd";
    string exportPath = fileName + "_export." + formatExt;
    using (PsdImage image = (PsdImage)Image.Load(sourceFilePath))
    {
        var smartObjectLayer = (SmartObjectLayer)image.Layers[0];

        AssertAreEqual(left, smartObjectLayer.ContentsBounds.Left);
        AssertAreEqual(top, smartObjectLayer.ContentsBounds.Top);
        AssertAreEqual(right, smartObjectLayer.ContentsBounds.Right);
        AssertAreEqual(bottom, smartObjectLayer.ContentsBounds.Bottom);

        // Let's export the embedded smart object image from the PSD smart object layer
        smartObjectLayer.ExportContents(exportPath);

        // Let's check if the original image is saved correctly
        image.Save(psdOutputPath, new PsdOptions(image));
        image.Save(pngOutputPath, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });

        using (var innerImage = (RasterImage)smartObjectLayer.LoadContents(null))
        {
            AssertAreEqual(format, innerImage.FileFormat);

            // Let's invert original smart object image
            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);

            // Let's replace the embedded smart object image in the PSD layer
            smartObjectLayer.ReplaceContents(innerImage);
        }

        // Let's check if the updated image is saved correctly
        image.Save(psd2OutputPath, new PsdOptions(image));
        image.Save(png2OutputPath, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}

See Also