Browse our Products

Aspose.PSD for Python via .NET 25.7 - Release Notes

KeySummaryCategory
PSDPYTHON-205Add support for exporting Layers with Layer Effects to raster formatsFeature
PSDPYTHON-206Add a property to toggle all layer effects visibilityFeature
PSDPYTHON-209Update the structure of Gradient classes. Create base class for Gradeint specificEnhancement
PSDPYTHON-212Make correct initializing of Layers with Linked Layers RegistryBug
PSDPYTHON-219Inaccurate rendering of Smart Object LayerBug
PSDPYTHON-220Error when applying deformation due to invalid ‘Processing Area’ value is 2Bug

Public API Changes

Added APIs:

  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientFillSettings.Gradient
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.BlendingOptions.AreEffectsEnabled
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.InnerShadowEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.ColorOverlayEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.DropShadowEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.OuterGlowEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.ILayerEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.StrokeEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.GradientOverlayEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.PatternOverlayEffect.GetEffectBounds(Aspose.PSD.Rectangle,System.Int32)
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.DropShadow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.OuterGlow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.PatternOverlay
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.GradientOverlay
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.ColorOverlay
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.Satin
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.InnerGlow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.InnerShadow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.Stroke
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerEffects.LayerEffectsTypes.BevelEmboss
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.GradientType
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.FillType
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.AlignWithLayer
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Dither
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Reverse
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Angle
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.HorizontalOffset
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.VerticalOffset
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Scale
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Gradient
  • T:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientMapSettings
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientMapSettings.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientMapSettings.Dither
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientMapSettings.Reverse
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientMapSettings.Gradient
  • T:Aspose.PSD.FileFormats.Psd.Layers.Gradient.BaseGradient
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.BaseGradient.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.BaseGradient.GradientName
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.BaseGradient.GradientMode
  • T:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.RndNumberSeed
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.ShowTransparency
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.UseVectorColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.Roughness
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.ColorModel
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.MinimumColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.MaximumColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.ExpansionCount
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.NoiseGradient.GradientMode
  • T:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.GradientMode
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.Interpolation
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.GenerateLfx2ResourceNodes
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.ColorPoints
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.TransparencyPoints
  • P:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.Color
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.AddColorPoint
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.AddTransparencyPoint
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.RemoveTransparencyPoint(Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientTransparencyPoint)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Gradient.SolidGradient.RemoveColorPoint(Aspose.PSD.FileFormats.Psd.Layers.IGradientColorPoint)

Removed APIs:

  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientFillSettings.GradientName
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.BaseFxResource.Signature
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Color
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.ColorPoints
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.TransparencyPoints
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.AddColorPoint
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.AddTransparencyPoint
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.RemoveTransparencyPoint(Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientTransparencyPoint)
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.RemoveColorPoint(Aspose.PSD.FileFormats.Psd.Layers.IGradientColorPoint)
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.DropShadow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.OuterGlow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.PatternOverlay
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.GradientOverlay
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.ColorOverlay
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.Satin
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.InnerGlow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.InnerShadow
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.Stroke
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lfx2Resources.LayerEffectsTypes.BevelEmboss
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.GenerateLfx2ResourceNodes
  • T:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.RndNumberSeed
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.ShowTransparency
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.UseVectorColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.Roughness
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.ColorModel
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.MinimumColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.MaximumColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.NoiseGradientFillSettings.ExpansionCount
  • T:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.GradientType
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.GradientName
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.FillType
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.AlignWithLayer
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.Dither
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.Reverse
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.Angle
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.HorizontalOffset
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.VerticalOffset
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.Scale
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.BaseGradientFillSettings.GradientMode
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Interpolation
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientFillSettings.GradientMode

Usage examples:

PSDPYTHON-205. Add support for exporting Layers with Layer Effects to raster formats

        srcFile = "1958.psd"
        outputFile = "out_1958.png"

        loadOpt = PsdLoadOptions()
        loadOpt.load_effects_resource = True
        with PsdImage.load(srcFile, loadOpt) as img:
            psdImage = cast(PsdImage, img)
            layer1 = psdImage.layers[1]

            layerBounds = layer1.bounds
            for effect in layer1.blending_options.effects:
                effectBounds = effect.get_effect_bounds(layer1.bounds, psdImage.global_angle)
                layerBounds = Rectangle.union(layerBounds, effectBounds)

            boundsToExport = Rectangle.empty  # The default value is to save only the layer with effects.
            # boundsToExport = psdImage.bounds  # To save within the PsdImage bounds at the original layer location

            pngOpt = PngOptions()
            pngOpt.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
            layer1.save(
                outputFile,
                pngOpt,
                boundsToExport)

            with open(outputFile, 'rb') as imgStream:
                loadedLayer = Layer(imgStream)
                if loadedLayer.size == layerBounds.size:
                    print("The size is calculated correctly.")

PSDPYTHON-206. Add a property to toggle all layer effects visibility

        srcFile = "2485.psd"
        outputOnFile = "on_2485.png"
        outputOffFile = "off_2485.png"

        loadOpt = PsdLoadOptions()
        loadOpt.load_effects_resource = True
        with PsdImage.load(srcFile, loadOpt) as img:
            psdImage = cast(PsdImage, img)
            psdImage.save(outputOnFile)
            psdImage.layers[1].blending_options.are_effects_enabled = False
            psdImage.save(outputOffFile)

PSDPYTHON-209. Update the structure of Gradient classes. Create base class for Gradeint specific

        inputFile = "StrokeNoise.psd"
        outputFile = "output.psd"

        loadOpt = PsdLoadOptions()
        loadOpt.load_effects_resource = True

        # First pass - load and modify
        with PsdImage.load(inputFile, loadOpt) as img:
            psdImage = cast(PsdImage, img)
            gradientStroke = cast(StrokeEffect, psdImage.layers[0].blending_options.effects[0])
            gradientFillSettings = cast(GradientFillSettings, gradientStroke.fill_settings)

            # Check common gradient fill settings properties
            assert gradientFillSettings is not None
            assert gradientFillSettings.align_with_layer == True
            assert gradientFillSettings.dither == True
            assert gradientFillSettings.reverse == True
            assert gradientFillSettings.angle == 116.0
            assert gradientFillSettings.scale == 122
            assert gradientFillSettings.gradient_type == GradientType.ANGLE

            # Check Noise gradient properties
            noiseGradient = cast(NoiseGradient, gradientFillSettings.gradient)
            assert noiseGradient is not None
            assert noiseGradient.gradient_mode == GradientKind.NOISE
            assert noiseGradient.rnd_number_seed == 2107422935
            assert noiseGradient.show_transparency == False
            assert noiseGradient.use_vector_color == False
            assert noiseGradient.roughness == 2048
            assert noiseGradient.color_model == NoiseColorModel.RGB
            assert noiseGradient.minimum_color.get_as_long() == 0
            assert noiseGradient.maximum_color.get_as_long() == 28147819798528050

            # Change gradient settings
            gradientFillSettings.align_with_layer = False
            gradientFillSettings.dither = False
            gradientFillSettings.reverse = False
            gradientFillSettings.angle = 30
            gradientFillSettings.scale = 80
            gradientFillSettings.gradient_type = GradientType.LINEAR

            solidGradient = SolidGradient()
            solidGradient.interpolation = 2048
            solidGradient.color_points[0].raw_color.components[0].value = 255  # A
            solidGradient.color_points[0].raw_color.components[1].value = 255  # R
            solidGradient.color_points[0].raw_color.components[2].value = 0  # G
            solidGradient.color_points[0].raw_color.components[3].value = 0  # B
            solidGradient.transparency_points[1].opacity = 50
            gradientFillSettings.gradient = solidGradient

            psdImage.save(outputFile)

        # Second pass - verify changes
        with PsdImage.load(outputFile) as img:
            psdImage = cast(PsdImage, img)
            gradientStroke = cast(StrokeEffect, psdImage.layers[0].blending_options.effects[0])
            gradientFillSettings = cast(GradientFillSettings, gradientStroke.fill_settings)

            # Check common gradient fill settings properties
            assert gradientFillSettings is not None
            assert gradientFillSettings.align_with_layer == False
            assert gradientFillSettings.dither == False
            assert gradientFillSettings.reverse == False
            assert gradientFillSettings.angle == 30.0
            assert gradientFillSettings.scale == 80
            assert gradientFillSettings.gradient_type == GradientType.LINEAR

            solidGradient = cast(SolidGradient, gradientFillSettings.gradient)
            assert solidGradient is not None
            assert solidGradient.interpolation == 2048
            assert solidGradient.color_points[0].raw_color.components[0].value == 255
            assert solidGradient.color_points[0].raw_color.components[1].value == 255
            assert solidGradient.color_points[0].raw_color.components[2].value == 0
            assert solidGradient.color_points[0].raw_color.components[3].value == 0
            assert solidGradient.transparency_points[1].opacity == 50.0

PSDPYTHON-212. Make correct initializing of Layers with Linked Layers Registry

        files = ["add.jpg", "add.psd"]

        for i in range(len(files)):
            sourceFile = "input.psd"
            addFile = files[i]
            outputFile = "output.psd"

            with PsdImage.load(sourceFile) as img:
                psdImage = cast(PsdImage, img)
                with open(addFile, 'rb') as stream:
                    with SmartObjectLayer(stream) as smartLayer:
                        psdImage.add_layer(smartLayer)

                        layer1 = psdImage.layers[1]
                        layer2 = psdImage.layers[2]

                        size1Before = layer1.size
                        size2Before = layer2.size

                        psdImage.linked_layers_manager.link_layers([layer1, layer2])

                        layer1.resize(100, 100)

                        size1After = layer1.size
                        size2After = layer2.size

                        assert size1Before != size1After
                        assert size2Before != size2After
                        psdImage.save(outputFile)

PSDPYTHON-219. Inaccurate rendering of Smart Object Layer

		sourceFile = "test.psd"
        newContent = "newImage.png"
        export = "export.png"

        loadOpt = PsdLoadOptions()
        loadOpt.allow_warp_repaint = True

        with PsdImage.load(sourceFile, loadOpt) as img:
            psdImage = cast(PsdImage, img)
            with Image.load(newContent) as replaceImage:
                layers = psdImage.layers
                for i in range(len(layers)):
                    if isinstance(layers[i], SmartObjectLayer):
                        smart_layer = cast(SmartObjectLayer, layers[i])
                        smart_layer.replace_contents(replaceImage)
                        smart_layer.update_modified_content()
                        break

            pngOpt = PngOptions()
            pngOpt.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
            psdImage.save(export, pngOpt)

PSDPYTHON-220. Error when applying deformation due to invalid ‘Processing Area’ value is 2

        sourceFile = "Warping.psd"
        outputFile = "export2.png"

        loadOpt = PsdLoadOptions()
        loadOpt.load_effects_resource = True
        loadOpt.allow_warp_repaint = True

        with PsdImage.load(sourceFile, loadOpt) as img:
            psdImage = cast(PsdImage, img)

            # Get WarpSettings from Smart Layer
            smart_layer = cast(SmartObjectLayer, psdImage.layers[1])
            warp_settings = smart_layer.warp_settings

            # Set size of warp processing area
            warp_settings.processing_area = 2
            smart_layer.warp_settings = warp_settings

            # Save with PNG options
            pngOpt = PngOptions()
            pngOpt.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
            psdImage.save(outputFile, pngOpt)