smartObjectLayer with filter->distort-->displace fail

when outerSmartObjectLayer.replaceContents(innerPsd) always failed,lost displace effects.

@maluo.wc

It sounds like you’re experiencing issues with the ReplaceContents method of the SmartObjectLayer when trying to replace the contents of a smart object that has distortion effects applied. Here’s a structured approach to troubleshoot and resolve the issue:

Cause: The problem may arise from incompatible image formats, mismatched resolution settings, or failure to update the modified content after replacement.

Solution:

  1. Check the Image Format: Ensure that the image you are trying to replace the contents with is in a compatible format. The ReplaceContents method supports various formats, so confirm that your image is one of them.

  2. Resolution Settings: Verify that the new image matches the resolution settings of the smart object. You can specify resolution settings in the ReplaceContents method.

  3. Export and Import: Before replacing the contents, export the current contents of the smart object using the ExportContents method to ensure they are intact. After confirming the export, proceed to replace the contents.

  4. Update Modified Content: After replacing the contents, call the UpdateModifiedContent method to ensure that the changes are applied correctly.

  5. Check for Exceptions: If the ReplaceContents method fails, it may throw a PsdImageException. Catch this exception and review the message for details on why the operation failed.

Next Steps: Here’s a minimal code example to illustrate the implementation:

using (PsdImage image = (PsdImage)Image.Load("yourfile.psd"))
{
    var smartObjectLayer = (SmartObjectLayer)image.Layers[0];
    
    // Export current contents for verification
    smartObjectLayer.ExportContents("exported_image.png");
    
    // Load new image to replace contents
    using (var newImage = (RasterImage)Image.Load("new_image.png"))
    {
        // Replace contents
        smartObjectLayer.ReplaceContents(newImage);
    }
    
    // Update modified content
    smartObjectLayer.UpdateModifiedContent();
    
    // Save the updated PSD
    image.Save("updated_file.psd");
}

If you continue to face issues, please provide any error messages or additional context, and I will be happy to assist you further. Let me know if this resolves your problem!

@maluo.wc please provide input file and code snippet that was used to reproduce this. Please additionaly provide information about of version of Aspose.PSD and your environment.

version:

com.aspose aspose-psd 25.5-jdk16

PSD file:
https://ae-superbuyer.oss-ap-southeast-1.aliyuncs.com/psd/bground_1.psd

The file has a smartObject layer named “mouse” .

myCode:
// 步骤 1: 按名称前缀查找目标智能对象图层。
SmartObjectLayer smartObjectLayer = #layername:mouse

// 步骤 2: 获取内部画布尺寸并替换内容。
int canvasWidth;
int canvasHeight;
PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
psdLoadOptions.setAllowWarpRepaint(true);
psdLoadOptions.setLoadEffectsResource(true);
try (PsdImage innerContent = (PsdImage)smartObjectLayer.loadContents(psdLoadOptions)) {
canvasWidth = innerContent.getWidth();
canvasHeight = innerContent.getHeight();
// new Image
try (RasterImage newContentImage = (RasterImage) Image.load(newContentPath)) {
newContentImage.resize(canvasWidth, canvasHeight);

               //update  smartObjectLayer
               smartObjectLayer.replaceContents(newContentImage);
        }
            //layer.getSmartObjectProvider().updateAllModifiedContent();
    }