Browse our Products

Aspose.PSD for Java 26.8 - Release Notes

KeySummaryCategory
PSDJAVA-867Support of Grayscale ColorMode PSD Image saving with 32 bit per channel.Feature
PSDJAVA-870Implement reading/writing Displace smart filter data.Feature
PSDJAVA-871[AI Format] Implementing the Type 1 (function) Shading.Feature
PSDJAVA-872Improving Layer Effects processing according to the logic of the new Overlay Effects Blending algorithm.Bug
PSDJAVA-873Arithmetic operation resulted in an overflow on Image.Load in file with complex smart filter Liquify.Bug
PSDJAVA-874Effect loss when working with smart objects.Bug
PSDJAVA-875Regression: Output becomes much darker than the source image.Bug

Public API Changes

Added APIs:

  • M:com.aspose.psd.fileformats.psd.layers.layerresources.typetoolinfostructures.PathStructure.#ctor(com.aspose.psd.fileformats.psd.layers.layerresources.ClassID,java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.typetoolinfostructures.AliasStructure.getDisplacementMapPath
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.typetoolinfostructures.AliasStructure.getPayload
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.typetoolinfostructures.AliasStructure.setPayload(byte[])
  • T:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.#ctor(java.lang.String,boolean)
  • F:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.FilterType
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getHorizontalScale
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getVerticalScale
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getName
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getDisplacementMethod
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getDisplaceMapData
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getDisplacementMapPath
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getFilterId
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.getUndefinedAreas
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.setDisplacementMethod(int)
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.setUndefinedAreas(int)
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.setHorizontalScale(double)
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.setVerticalScale(double)
  • M:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplaceSmartFilter.isDisplacementMapEmbedded
  • T:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplacementMethod
  • F:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplacementMethod.Stretch
  • F:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.DisplacementMethod.Tile
  • T:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.UndefinedAreas
  • F:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.UndefinedAreas.RepeatEdgePixels
  • F:com.aspose.psd.fileformats.psd.layers.smartfilters.filters.UndefinedAreas.WrapAround

Removed APIs:

  • M:com.aspose.psd.fileformats.psd.layers.layerresources.typetoolinfostructures.AliasStructure.getFullPath
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.typetoolinfostructures.AliasStructure.setFullPath(java.lang.String)

Usage examples:

PSDJAVA-867. Support of Grayscale ColorMode PSD Image saving with 32 bit per channel.

    public static void main(String[] args) {
        String sourceFile = "src/main/resources/inGrayscale32no.psd";
        String outputFilePsd = "src/main/resources/inGrayscale32no_out.psd";
        String outputFilePng = "src/main/resources/inGrayscale32no_out.png";

        // Load the original 32‑bit/channel Grayscale PSD
        try (Image image = Image.load(sourceFile)) {
            var psd = (PsdImage) image;
            assertAreEqual(32, psd.getBitsPerChannel(), "Bits per channel should be 32 on start");
            PsdOptions psdOptions = new PsdOptions();
            psdOptions.setChannelBitsCount((short) 32);
            image.save(outputFilePsd, psdOptions);

            PngOptions pngOptions = new PngOptions();
            pngOptions.setColorType(PngColorType.TruecolorWithAlpha);
            image.save(outputFilePng, pngOptions);
        }

        // Reload the saved file – no exception should be thrown
        try (Image reloaded = Image.load(outputFilePsd)) {
            var psd = (PsdImage) reloaded;
            assertAreEqual(32, psd.getBitsPerChannel(), "Bits per channel should remain 32 after round‑trip.");
        }
    }

    private static void assertAreEqual(Object expected, Object actual, String message) {
        if (!expected.equals(actual)) {
            throw new IllegalArgumentException(message);
        }
    }

PSDJAVA-870. Implement reading/writing Displace smart filter data.

    public static void main(String[] args) {
        String sourceFile = "src/main/resources/no_displace_filter.psd";
        String outputFile = "src/main/resources/output_displace_filter.psd";
        String displaceMapPath = "src/main/resources/displace_map.psd";

        try (PsdImage image = (PsdImage) Image.load(sourceFile)) {
            SmartObjectLayer smartObj = (SmartObjectLayer) image.getLayers()[1];
            DisplaceSmartFilter displace = new DisplaceSmartFilter(displaceMapPath, true);
            displace.setHorizontalScale(12.5);
            displace.setVerticalScale(15.0);
            displace.setDisplacementMethod(DisplacementMethod.Tile);
            displace.setUndefinedAreas(UndefinedAreas.WrapAround);

            List<SmartFilter> filters = new List<SmartFilter>(smartObj.getSmartFilters().getFilters());
            filters.add(displace);
            smartObj.getSmartFilters().setFilters(filters.toArray(new SmartFilter[0]));
            smartObj.getSmartFilters().updateResourceValues();
            image.save(outputFile);

            // Need to check that output psd file can be opened by Photoshop
        }

        try (PsdImage image = (PsdImage) Image.load(outputFile)) {
            SmartObjectLayer smartObj = (SmartObjectLayer) image.getLayers()[1];
            DisplaceSmartFilter displace = (DisplaceSmartFilter) smartObj
                    .getSmartFilters()
                    .getFilters()[smartObj.getSmartFilters().getFilters().length - 1];

            assertAreEqual(12.5, displace.getHorizontalScale());
            assertAreEqual(15.0, displace.getVerticalScale());
            assertAreEqual(DisplacementMethod.Tile, displace.getDisplacementMethod());
            assertAreEqual(UndefinedAreas.WrapAround, displace.getUndefinedAreas());
            assertAreEqual(true, displace.isDisplacementMapEmbedded());
            assertAreEqual(true, displace.getDisplaceMapData() != null);
        }
    }

    private static void assertAreEqual(Object expected, Object actual, String message) {
        if (!expected.equals(actual)) {
            throw new IllegalArgumentException(message);
        }
    }

PSDJAVA-871. [AI Format] Implementing the Type 1 (function) Shading.

    String sourceFile = "src/main/resources/shadingType1.ai";
    String outputFilePath = "src/main/resources/shadingType1.png";
    
    try (AiImage image = (AiImage) Image.load(sourceFile)) {
        image.save(outputFilePath, new PngOptions());
    }

PSDJAVA-872. Improving Layer Effects processing according to the logic of the new Overlay Effects Blending algorithm.

    PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
    psdLoadOptions.setLoadEffectsResource(true);

    try (Image image = Image.load(sourceFile, psdLoadOptions)) {
        image.save(outputFile, new PngOptions());
    }

PSDJAVA-873. Arithmetic operation resulted in an overflow on Image.Load in file with complex smart filter Liquify.

    String sourceFile = "src/main/resources/m28719.psd";

    // Check opening of customer file.
    try (var psdImage = (PsdImage) Image.load(sourceFile)) {
    }

PSDJAVA-874. Effect loss when working with smart objects.

    String srcFile = "src/main/resources/1472_sampledog.psd";
    String outFile2 = "src/main/resources/out_2_sampledog.png";
    String outFile3 = "src/main/resources/out_3_sampledog.png";

    PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
    psdLoadOptions.setLoadEffectsResource(true);

    try (PsdImage psdImage = (PsdImage) Image.load(srcFile, psdLoadOptions)) {
        SmartObjectLayer smartObject = (SmartObjectLayer) psdImage.getLayers()[1];
        PsdImage smartObjectPsdImage = (PsdImage) smartObject.loadContents(psdLoadOptions);

        SmartObjectLayer smartObject2 = smartObjectPsdImage.getSmartObjectProvider().convertToSmartObject(smartObjectPsdImage.getLayers());

        PngOptions pngOptions = new PngOptions();
        pngOptions.setColorType(PngColorType.TruecolorWithAlpha);

        smartObjectPsdImage.save(outFile2, pngOptions);
        smartObject2.save(outFile3, pngOptions);
    }