Browse our Products

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

KeySummaryCategory
PSDPYTHON-276IndexOutOfRangeException in the large file 2500x36667 (DPI 300).Bug
PSDPYTHON-286The file loses a large amount of resources after saving.Bug
PSDPYTHON-287ArgumentException on loading section resource.Bug
PSDPYTHON-288SmartObjectLayer the size is changed after setContents and updateModifiedContent.Bug

Public API Changes

Added APIs:

  • None

Removed APIs:

  • None

Usage examples:

PSDPYTHON-276. IndexOutOfRangeException in the large file 2500x36667 (DPI 300).

sourceFile = "blind3_nolock.psb"
outputFile = "blind3_nolock.png"

loadOpt = PsdLoadOptions()
loadOpt.load_effects_resource = True

with PsdImage.load(sourceFile, loadOpt) as img:
    psdImage = cast(PsdImage, img)
    layers = psdImage.layers
    pngOpt = PngOptions()
    pngOpt.color_type = PngColorType.TRUECOLOR_WITH_ALPHA
    psdImage.save(outputFile, pngOpt)

PSDPYTHON-286. The file loses a large amount of resources after saving.

srcFile = "Alexandria.psd"
outFile = "output.psd"

imageResourcesCount = 0
DefaultResourcesCount = 2
SeveralResourcesCount = 3

# Save all resources as default (options.resources = None)
with PsdImage.load(srcFile) as img:
    psdImage = cast(PsdImage, img)
    options = PsdOptions()
    assert options.resources is None

    imageResourcesCount = len(psdImage.image_resources)
    psdImage.save(outFile, PsdOptions())

    assert options.resources is None

# Verify resources count after default save
with PsdImage.load(outFile) as img:
    psdImage = cast(PsdImage, img)
    assert imageResourcesCount == len(psdImage.image_resources)

# Save without resources
with PsdImage.load(srcFile) as img:
    psdImage = cast(PsdImage, img)
    options = PsdOptions()
    options.resources = []
    assert len(options.resources) == 0

    psdImage.save(outFile, options)

    assert len(options.resources) == 0

# Verify resources count after saving without resources
with PsdImage.load(outFile) as img:
    psdImage = cast(PsdImage, img)
    assert DefaultResourcesCount == len(psdImage.image_resources)

# Save with several resources
with PsdImage.load(srcFile) as img:
    psdImage = cast(PsdImage, img)
    psdOptions = PsdOptions()
    newResources = []
    newResources.append(PrintScaleResource())
    psdOptions.resources = newResources

    psdImage.save(outFile, psdOptions)

# Verify resources count after saving several resources
with PsdImage.load(outFile) as img:
    psdImage = cast(PsdImage, img)
    assert SeveralResourcesCount == len(psdImage.image_resources)

PSDPYTHON-287. ArgumentException on loading section resource.

srcFile = "test-2026-02-05.psd"

loadOpt = PsdLoadOptions()
loadOpt.use_disk_for_load_effects_resource = True
loadOpt.allow_warp_repaint = True
loadOpt.use_icc_profile_conversion = False

with PsdImage.load(io.BytesIO(open(srcFile, "rb").read()), loadOpt) as img:
    psdImage = cast(PsdImage, img)

PSDPYTHON-288. SmartObjectLayer the size is changed after setContents and updateModifiedContent.

def AreSizesEqual(expectedSize, actualSize):
    if expectedSize != actualSize:
        raise Exception("Sizes are not equal")

etalonPsdPath = "expected2000x2000.psd"
psdFilePath = "file.psd"
replaceFilePath = "2000x2000.png"

expectedSize1 = None
expectedSize3 = None

with PsdImage.load(etalonPsdPath) as img:
    etalonPsd = cast(PsdImage, img)
    smartObj1 = cast(SmartObjectLayer, etalonPsd.layers[0])
    smartObj3 = cast(SmartObjectLayer, etalonPsd.layers[1])
    expectedSize1 = smartObj1.size
    expectedSize3 = smartObj3.size

with PsdImage.load(psdFilePath) as img:
    psdImage = cast(PsdImage, img)
    smartObj1 = cast(SmartObjectLayer, psdImage.layers[0])
    smartObj3 = cast(SmartObjectLayer, psdImage.layers[1])

    smartObj1.replace_contents(replaceFilePath)
    smartObj1.update_modified_content()

    smartObj3.replace_contents(replaceFilePath)
    smartObj3.update_modified_content()

    AreSizesEqual(expectedSize1, smartObj1.size)
    AreSizesEqual(expectedSize3, smartObj3.size)