Can't add a SmartObjectLayer to a PSDImage

The following code fails with:
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object. at Aspose.PSD.FileFormats.Psd.PsdImage.(SmartObjectLayer ) at Aspose.PSD.FileFormats.Psd.PsdImage.(Layer , Int32 ) at Aspose.PSD.FileFormats.Psd.PsdImage.AddLayer(Layer layer) at Program.<Main>$(String[] args)

At first, I thought it could be the MemoryStream being messed up when retrieving the image, so I’ve hardcoded a PNG file (hence the getImage() method). Still same result.
I also tried with Layer instead and that worked like a charm… but I need it as a SmartObjectLayer so I can later swap images using Photoshop directly.

…so, what’s the proper way to add a SmartObject layer to a PSD?
Btw, psd.SmartObjectProvider is null, so converting a Layer to a SmartObjectLayer also fails.
(using Aspose 24.11.0)

using Aspose.PSD;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Psd.Layers.SmartObjects;
using Aspose.PSD.ImageOptions;

new License().SetLicense("XXXXX");

using (var psd = new PsdImage(300, 100))
{
    var sol = new SmartObjectLayer(getImage());
    psd.AddLayer(sol);
    psd.Save("mySmartTest.psd", new PsdOptions());
}

/* - */

static MemoryStream getImage()
{
    var png = "iVBORw0KGgoAAAANSUhEUgAAAQ4AAAAyCAMAAACaoMX1AAACmlBMVEVHcEz////////////////////////a18n////////////S4M7///////////////////////////////////86lDn////////////////////////2+v3////////////////Alyr///////////////////////////////////////+5tT/////////////////////////////////////////////byiz///////////////9aoznrnk7///////////8smc5Ens3y1lB/sN7///9Bmsp2rUyyoRD3k0j////3fS0tl8/020DzaypNnTz///8tl81DmTyynw8rltH2di08lTr1cSr4jT4sl9S0nxA+mdN5r+W2sDr1eyu3pRRZpM1rqd/0dSr8gzj54kM5ksz2hS7byDL51lc9ljaTv0iQu+amvWG1ohL3hDMsmc46lDo5lDn5hzj+yWz3cSbzbSp7sEU3kzqxohCMu1H4fCSFs+D+tlSLrc84kzr8jT87lTqwsJ7ezDeXwUyxnQ/9jD2wnQ6ZwkWs0DxFmT9epDFBmDlUodJvqUgwltbp1i3/0HZvq0Sxnw6DtkOMvT/NuSk7lUFqqDr8r02eqr6+rhr6i0GYw0G8qxdGmjmkyTr5nkjNuyP33kdHmjcrmMzs3UWOvFv+znFcoNZmqjfyayrx5D6BreI1kcn350Gkx/6fwfLbxCasz0Py6FP62kTybStZojf///8tmM5rpNX3i0eynxAykspNnTr2iC33ki5/slHMuiNCmDq/rRnUwyZ1p9bi0zP5qEnn2jr4oDWHuFD4nEvFsh31fS1uqVA7kMmOu0fzbyq5phT8vVxXntFlpUr7sk/t4j45nNDx4kjy5k32kD6kykRWz45yAAAA1HRSTlMA9QYy+ppVAfL+nwTbDDYgkH+rprn9PjrqePeEF2Xuz9UJCA9cGkhEyLMUwhEmCa7elCloiXpu5v7SdCy9/hgvT+LKEiz9SyX/Ov1jR6OqthdxOC2xhyNcaThdU27MI7TILe7kxZbz2HpJT+P8G5Px83vnpOSXe/ijenkssJpKyYXUJ5xn7LHa+1T+spJboLSIIjzzy7I5uNfyZLRzn+vPP8bS7UXhzZXzop1W1WntwULVVni1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";
    var ms = new MemoryStream(Convert.FromBase64String(png));
    ms.Position = 0;
    return ms;
}

@gonzalo.gatti.ethofy

It seems that you are encountering a NullReferenceException when trying to add a SmartObjectLayer to a PsdImage. This issue may arise due to the SmartObjectProvider being null, which indicates that the current version of Aspose.PSD you are using (24.11.0) may not fully support the functionality you are trying to implement.

Currently, the Aspose.PSD library has limited support for Smart Objects, and it appears that the SmartObjectLayer class does not inherit from the Layer class in the way you might expect. This limitation means that you cannot directly convert a Layer to a SmartObjectLayer, and the library may not yet support adding Smart Object layers in the manner you are attempting.

To work with Smart Object layers, you might want to consider the following steps:

  1. Check for Updates: Ensure you are using the latest version of Aspose.PSD, as newer versions may have added support for additional features, including Smart Objects.

  2. Use Existing Examples: Review existing examples that demonstrate how to work with Smart Object layers. For instance, there are examples available that show how to manipulate and export Smart Object layers, which might provide insights into the correct usage of the API.

  3. Contact Support: If the functionality you need is critical, consider reaching out to Aspose support or checking their issue tracking system for any reported issues related to Smart Object layers. They may have a roadmap for future updates that could address your needs.

Here is a basic example of how to manipulate Smart Object layers, which might help you understand the correct approach:

using Aspose.PSD;
using Aspose.PSD.FileFormats.Psd;
using Aspose.PSD.FileFormats.Psd.Layers.SmartObjects;

using (var psd = new PsdImage("path_to_your_psd_file.psd"))
{
    var smartObjectLayer = (SmartObjectLayer)psd.Layers[0]; // Assuming the first layer is a Smart Object
    smartObjectLayer.ExportContents("exported_image.png"); // Export the contents of the Smart Object
    // Further manipulation can be done here
}

This example assumes you have a PSD file with a Smart Object layer. You can export the contents of the Smart Object for further manipulation.

If you need more specific functionality or encounter further issues, please provide additional details, and I will do my best to assist you.

Sources:
[1]: Error cannot convert FillLayer to SmartObjectLayer
[2]: SupportOfEmbeddedSmartObjects.cs

@gonzalo.gatti.ethofy
Please try this workaround for your case:

using (var psd = new PsdImage(300, 100))
{
    var sol = new SmartObjectLayer(getImage());
    psd.GlobalLayerResources = new LayerResource[0]; // <- This line should help.
    psd.AddLayer(sol);
    psd.Save("mySmartTest.psd", new PsdOptions());
}

To fix this issue in future we have opened the following new ticket(s) in our internal issue tracking system and will deliver their fixes according to the terms mentioned in Free Support Policies.

Issue ID(s): PSDNET-2255

You can obtain Paid Support Services if you need support on a priority basis, along with the direct access to our Paid Support management team.