Catatan Rilis Aspose.PSD for Java 20.6

Contents
[ ]
Kunci Ringkasan Kategori
PSDJAVA-216 Dukungan untuk LnkEResource (Sumber Daya Layer Objek Pintar) Fitur
PSDJAVA-219 Dukungan untuk britResource (Sumber Daya Layer Penyesuaian Kecerahan/Kontras) Fitur
PSDJAVA-222 Pindahkan pengaturan DefaultReplacementFont ke dalam kelas ImageOptionsBase Perbaikan
PSDJAVA-217 Pengubahan ukuran file PSD tidak berfungsi dengan benar jika terdapat masker dalam layer penyesuaian yang memiliki batas kosong Bug
PSDJAVA-218 Gambar Psd dengan mode RGB 16 bit/channel hanya memperbarui layer pada pratinjau Bug
PSDJAVA-220 Perubahan Masker Layer PSD diabaikan saat disimpan Bug
PSDJAVA-221 Urutan Layer Tidak Tepat setelah menambahkan Layer Group ke Layer Group kosong Bug
PSDJAVA-223 Pengecualian saat memuat file PSD khusus dengan compound LnkE Resource dan properti adobeStockLicenseState Bug
PSDJAVA-224 Penyimpanan Berkas AI ke Format Jpeg2000 tidak berfungsi Bug
PSDJAVA-225 Layer Group dengan Mode Pencampuran Bukan PassThrough Tidak Dirender Bug
PSDJAVA-226 Pengecualian NullReference saat mencoba mengonversi file Psd tertentu ke gambar Bug
PSDJAVA-227 OverflowException saat mencoba membuka file Psd tertentu Bug

Perubahan API Publik

API Ditambahkan:

  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.getFileName
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.getFileSize
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.getFullPath
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.getRelativePath
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setAdobeStockId(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setDate(java.util.Date)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setElementName(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setElementRef(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setFileName(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setFileSize(long)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setFullPath(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource.setRelativePath(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getAssetLockedState
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getAssetModTime
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getChildDocId
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getCompId
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getFileCreator
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getFileType
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getLength
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getOriginalCompId
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getOriginalFileName
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getType
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getUniqueId
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.getVersion
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.hasFileOpenDescriptor
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.isLibraryLink
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setAssetLockedState(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setAssetModTime(double)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setChildDocId(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setCompId(int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setFileCreator(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setFileOpenDescriptor(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setFileType(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setLibraryLink(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setOriginalCompId(int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setOriginalFileName(java.lang.String)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource.setUniqueId(java.util.UUID)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource.getDataSourceCount
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource.getLength
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource.getPsdVersion
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource.getSignature
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource.isEmpty
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource.save(com.aspose.psd.StreamContainer,int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.Lnk2Resource.#ctor(com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource[])
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.Lnk2Resource.getKey
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LnkeResource.#ctor
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LnkeResource.#ctor(com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource[])
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LnkeResource.getKey
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LnkeResource.get_Item(int)
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFdDataSource
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LiFeDataSource
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSource
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkDataSourceType
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LinkResource
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.Lnk2Resource
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.linkresources.LnkeResource

API Dihapus:

  • M:com.aspose.psd.imageloadoptions.PsdLoadOptions.getDefaultReplacementFont
  • M:com.aspose.psd.imageloadoptions.PsdLoadOptions.setDefaultReplacementFont(java.lang.String)

Contoh Penggunaan:

PSDJAVA-216: Dukungan untuk LnkEResource (Sumber Daya Layer Objek Pintar)

 // Sebuah contoh tentang mengaitkan berbagai jenis aset (gambar raster, perpustakaan CC) ke PSD.

// Juga API dari LnkeResource dipertimbangkan.

// Sebuah kelas yang menyimpan metode dalam cakupan lokal

class LocalScopeExtension

{

    void assertIsTrue(boolean condition)

    {

        if (!condition)

        {

            throw new FormatException("ExampleOfLnkEResourceSupport bekerja tidak benar.");

        }

    }

    void assertAreEqual(Object actual, Object expected)

    {

        assertIsTrue(actual != null && actual.equals(expected));

    }

    // Contoh ini mendemonstrasikan bagaimana mendapatkan dan mengatur properti dari Photoshop Psd LnkE

    // Resource yang berisi informasi tentang file terkait eksternal.

    void exampleOfLnkEResourceSupport(

            String fileName,

            int length,

            int length2,

            int length3,

            int length4,

            String fullPath,

            String date,

            double assetModTime,

            String childDocId,

            boolean locked,

            String uid,

            String name,

            String originalFileName,

            String fileType,

            long size)

    {

        String outputPath = "out_" + fileName;

        // Memuat PSD yang telah ditentukan sebelumnya

        PsdImage image = (PsdImage)Image.load(fileName);

        try

        {

            // Mencari LnkeResource di antara sumber daya layer global

            LnkeResource lnkeResource = null;

            for (LayerResource resource : image.getGlobalLayerResources())

            {

                if (resource instanceof LnkeResource)

                {

                    lnkeResource = (LnkeResource)resource;

                    // Memverifikasi properti LnkeResource

                    assertAreEqual(lnkeResource.getLength(), length);

                    assertAreEqual(lnkeResource.get_Item(0).getUniqueId(), UUID.fromString(uid));

                    assertAreEqual(lnkeResource.get_Item(0).getFullPath(), fullPath);

                    assertAreEqual(new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(lnkeResource.get_Item(0).getDate()), date);

                    assertAreEqual(lnkeResource.get_Item(0).getAssetModTime(), assetModTime);

                    assertAreEqual(lnkeResource.get_Item(0).getAssetLockedState(), locked);

                    assertAreEqual(lnkeResource.get_Item(0).getFileName(), name);

                    assertAreEqual(lnkeResource.get_Item(0).getFileSize(), size);

                    assertAreEqual(lnkeResource.get_Item(0).getChildDocId(), childDocId);

                    assertAreEqual(lnkeResource.get_Item(0).getVersion(), 7);

                    assertAreEqual(lnkeResource.get_Item(0).getFileType().trim(), fileType);

                    assertAreEqual(lnkeResource.get_Item(0).getFileCreator().trim(), "");

                    assertAreEqual(lnkeResource.get_Item(0).getOriginalFileName(), originalFileName);

                    assertAreEqual(lnkeResource.get_Item(0).getCompId(), -1);

                    assertAreEqual(lnkeResource.get_Item(0).getOriginalCompId(), -1);

                    assertIsTrue(lnkeResource.get_Item(0).hasFileOpenDescriptor());

                    assertIsTrue(!lnkeResource.isEmpty());

                    assertIsTrue(lnkeResource.get_Item(0).getType() == LinkDataSourceType.liFE);

                    // Memperbarui properti LnkeResource

                    lnkeResource.get_Item(0).setFullPath("file:///C:/Aspose/net/Aspose.Psd/test/testdata/Images/Psd/SmartObjects/rgb8_2x2.png");

                    assertAreEqual(lnkeResource.getLength(), length2);

                    lnkeResource.get_Item(0).setFileName("rgb8_2x23.png");

                    assertAreEqual(lnkeResource.getLength(), length3);

                    lnkeResource.get_Item(0).setChildDocId(UUID.randomUUID().toString());

                    assertAreEqual(lnkeResource.getLength(), length4);

                    lnkeResource.get_Item(0).setDate(new Date());

                    lnkeResource.get_Item(0).setAssetModTime(Double.MAX_VALUE);

                    lnkeResource.get_Item(0).setFileSize(Long.MAX_VALUE);

                    lnkeResource.get_Item(0).setFileType("test");

                    lnkeResource.get_Item(0).setFileCreator("file");

                    lnkeResource.get_Item(0).setCompId(Integer.MAX_VALUE);

                    break;

                }

            }

            // Pastikan LnkeResource didukung

            assertIsTrue(lnkeResource != null);

            // Simpan salinan PSD yang dimuat

            image.save(outputPath, new PsdOptions(image));

        }

        finally

        {

            image.dispose();

        }

        // Memuat salinan yang disimpan

        PsdImage image1 = (PsdImage)Image.load(outputPath);

        try

        {

            // Mengonversi PSD ke format file PNG (dengan saluran alpha untuk transparansi)

            PngOptions pngOptions = new PngOptions();

            pngOptions.setColorType(PngColorType.TruecolorWithAlpha);

            image1.save(Path.changeExtension(outputPath, "png"), pngOptions);

        }

        finally

        {

            image1.dispose();

        }

    }

}

LocalScopeExtension $ = new LocalScopeExtension();

// Contoh ini mendemonstrasikan cara mendapatkan dan menetapkan properti dari Psd LnkE Resource yang

// berisi informasi tentang file JPEG eksternal yang terkait.

$.exampleOfLnkEResourceSupport(

        "photooverlay_5_new.psd",

        0x21c,

        0x26c,

        0x274,

        0x27c,

        "file:///C:/Users/cvallejo/Desktop/photo.jpg",

        "05/09/2017 22:24:51",

        0,

        "F062B9DB73E8D124167A4186E54664B0",

        false,

        "02df245c-36a2-11e7-a9d8-fdb2b61f07a7",

        "photo.jpg",

        "photo.jpg",

        "JPEG",

        0x1520d);

// Contoh ini mendemonstrasikan cara mendapatkan dan menetapkan properti dari LnkE Resource PSD yang

// berisi informasi tentang file PNG eksternal yang terkait.

$.exampleOfLnkEResourceSupport(

        "rgb8_2x2_linked.psd",

        0x284,

        0x290,

        0x294,

        0x2dc,

        "file:///C:/Aspose/net/Aspose.Psd/test/testdata/Issues/PSDNET-491/rgb8_2x2.png",

        "04/14/2020 14:23:44",

        0,

        "",

        false,

        "5867318f-3174-9f41-abca-22f56a75247e",

        "rgb8_2x2.png",

        "rgb8_2x2.png",

        "png",

        0x53);

// Contoh ini mendemonstrasikan cara mendapatkan dan menetapkan properti dari Psd LnkE Resource Photoshop

// yang berisi informasi tentang Aset Perpustakaan CC terkait eksternal.

$.exampleOfLnkEResourceSupport(

        "rgb8_2x2_asset_linked.psd",

        0x398,

        0x38c,

        0x388,

        0x3d0,

        "CC Libraries Asset “rgb8_2x2_linked/rgb8_2x2” (Fitur tersedia di Photoshop CC 2015)",

        "01/01/0001 00:00:00",

        1588890915488.0d,

        "",

        false,

        "ec15f0a8-7f13-a640-b928-7d29c6e9859c",

        "rgb8_2x2_linked",

        "rgb8_2x2.png",

        "png",

        0);

PSDJAVA-219: Dukungan untuk britResource (Sumber Daya Layer Penyesuaian Kecerahan/Kontras)

 // Contoh ini menunjukkan bagaimana Anda dapat mengubah Layer Sumber Daya Kecerahan/Kontras PSD secara pemrograman.

// Ini adalah API Aspose.PSD Level Rendah.

// Anda dapat menggunakan Layer Kecerahan/Kontras melalui API-nya, yang akan jauh lebih mudah,

// tetapi pengeditan sumber daya langsung PhotoShop memberi Anda lebih banyak kontrol atas konten berkas PSD.

String srcPath = "BrightnessContrastPS6.psd";

String dstPath = "BrightnessContrastPS6_output.psd";

// Memuat dokumen Photoshop yang berisi lapisan penyesuaian Kecerahan / Kontras

PsdImage psdImage = (PsdImage)Image.load(srcPath);

try

{

    // Mencari BritResource

    for (Layer layer : psdImage.getLayers())

    {

        if (layer instanceof BrightnessContrastLayer)

        {

            for (LayerResource layerResource : layer.getResources())

            {

                if (layerResource instanceof BritResource)

                {

                    BritResource resource = (BritResource)layerResource;

                    // Memverifikasi properti sumber daya

                    if (resource.getBrightness() != -40 ||

                            resource.getContrast() != 10 ||

                            resource.getLabColor() ||

                            resource.getMeanValueForBrightnessAndContrast() != 127)

                    {

                        throw new RuntimeException("BritResource dibaca dengan salah");

                    }

                    // Memperbarui properti sumber daya

                    resource.setBrightness((short)-40);

                    resource.setContrast((short)-14);

                    resource.setLabColor(true);

                    resource.setMeanValueForBrightnessAndContrast((short)200);

                    // Menyimpan salinan PSD yang telah diperbarui

                    psdImage.save(dstPath, new PsdOptions());

                    break;

                }

            }

        }

    }

}

finally

{

    psdImage.dispose();

}

PSDJAVA-217: Pengubahan ukuran file PSD tidak berfungsi dengan benar jika terdapat masker dalam layer penyesuaian yang memiliki batas kosong

 // Contoh pengubahan ukuran gambar yang berisi masker layer penyesuaian dengan batas kosong.

// Program memuat PSD yang telah ditentukan sebelumnya hanya untuk memeriksa apakah tidak ada pengecualian.

final int skala = 2; // koefisien arbitrer

String[] nama = {

        "OneRegularAndOneAdjustmentWithVectorAndLayerMask",

        "LevelsLayerWithLayerMaskRgb",

        "LevelsLayerWithLayerMaskCmyk",

};

for (String nama : nama)

{

    String srcFilePath = nama + ".psd";

    String dstFilePath = "output_" + srcFilePath;

    String dstPngFilePath = "output_" + nama + ".png";

    // Memuat PSD yang telah ditentukan sebelumnya yang berisi masker layer penyesuaian yang memiliki batas kosong

    PsdLoadOptions psdLoadOptions = new PsdLoadOptions();

    psdLoadOptions.setLoadEffectsResource(true);

    PsdImage image = (PsdImage)Image.load(srcFilePath, psdLoadOptions);

    try

    {

        // Mengubah ukuran gambar

        image.resize(image.getWidth() * skala, image.getHeight() * skala);

        // Menyimpan salinan PSD yang dimuat

        image.save(dstFilePath, new PsdOptions());

        // Eksport PSD ke format file PNG (dengan saluran alpha untuk transparansi)

        PngOptions pngOptions = new PngOptions();

        pngOptions.setColorType(PngColorType.TruecolorWithAlpha);

        image.save(dstPngFilePath, pngOptions);

    }

    finally

    {

        image.dispose();

    }

}

PSDJAVA-218: Gambar Psd dengan mode RGB 16 bit/channel hanya memperbarui layer pada pratinjau

 // Contoh memperbarui layer reguler untuk gambar RGB 16 bit. Program menggambar sesuatu

// pada setiap layer hanya untuk memastikan bahwa seluruh layer diperbarui dengan benar.

String sourceFilePath = "in.psd";

String outputFilePath = "output.psd";

// Memuat PSD yang telah ditentukan sebelumnya dalam mode RGB 16 bit

PsdImage image = (PsdImage)Image.load(sourceFilePath);

try

{

    for (Layer layer : image.getLayers())

    {

        // Menggambar nama layer dan batas dalam untuk layer reguler

        if (!(layer instanceof LayerGroup) && !(layer instanceof AdjustmentLayer) &&

                (layer.getWidth() > 100) && (layer.getHeight() > 100))

        {

            Graphics graphics = new Graphics(layer);

            graphics.drawString(layer.getName(), new Font("Arial", 10),

                    new SolidBrush(Color.getRed()), 15, 45);

            graphics.drawRectangle(new Pen(Color.getRed()), new Rectangle(30, 10, 40, 80));

        }

    }

    // Menyimpan salinan PSD yang dimuat

    image.save(outputFilePath, new PsdOptions(image));

}

finally

{

    image.dispose();

}

PSDJAVA-220: Perubahan Masker Layer PSD diabaikan saat disimpan

 // Sebuah kelas yang menyimpan metode dalam cakupan lokal

class LocalScopeExtension

{

    void assertAreEqual(Object actual, Object expected)

    {

        if (!(actual != null && actual.equals(expected)))

        {

            throw new FormatException("Contoh bekerja tidak benar.");

        }

    }

    // Mendapatkan nilai int yang dikonversi ke urutan byte big-endian.

    byte[] getBigEndianBytesInt32(int value)

    {

        byte[] bytes = new byte[4];

        bytes[0] = (byte)((value >> 24) & 0x000000FF);

        bytes[1] = (byte)((value >> 16) & 0x000000FF);

        bytes[2] = (byte)((value >> 8) & 0x000000FF);

        bytes[3] = (byte)value;

        return bytes;

    }

    // Mendapatkan nilai yang dikonversi dari big endian ke Int32.

    int fromBigEndianToInt32(byte[] bytes, int index)

    {

        if (bytes == null)

        {

            throw new ArgumentNullException("bytes");

        }

        if (index < 0 || index + 4 > bytes.length)

        {

            throw new ArgumentOutOfRangeException("index", "Indeks jatuh di luar array byte.");

        }

        return ((bytes[index] & 0xff) << 24) | ((bytes[index + 1] & 0xff) << 16) |

                ((bytes[index + 2] & 0xff) << 8) | (bytes[index + 3] & 0xff);

    }

    // Mendapatkan masker raster dari layer pada gambar PSD dan menyimpannya ke berkas

    void saveRasterMask(String maskFilePath, Layer layer)

    {

        LayerMaskDataShort maskData = (LayerMaskDataShort)layer.getLayerMaskData();

        FileStreamContainer container = FileStreamContainer.createFileStream(maskFilePath, false);

        try

        {

            container.write(getBigEndianBytesInt32(maskData.getTop()));

            container.write(getBigEndianBytesInt32(maskData.getLeft()));

            container.write(getBigEndianBytesInt32(maskData.getBottom()));

            container.write(getBigEndianBytesInt32(maskData.getRight()));

            container.writeByte(maskData.getDefaultColor());

            container.writeByte((byte)maskData.getFlags());

            container.write(getBigEndianBytesInt32(maskData.getImageData().length));

            container.write(maskData.getImageData(), 0, maskData.getImageData().length);

        }

        finally

        {

            container.dispose();

        }

    }

    // Menambahkan masker raster dari berkas ke layer dan menyimpannya ke gambar format PSD

    void addRasterMask(Layer layer, String maskSourcePath)

    {

        LayerMaskDataShort maskData = new LayerMaskDataShort();

        FileStreamContainer container = FileStreamContainer.openFileStream(maskSourcePath);

        try

        {

            byte[] bytes = new byte[22];

            assertAreEqual(container.read(bytes), 22);

            maskData.setTop(fromBigEndianToInt32(bytes, 0));

            maskData.setLeft(fromBigEndianToInt32(bytes, 4));

            maskData.setBottom(fromBigEndianToInt32(bytes, 8));

            maskData.setRight(fromBigEndianToInt32(bytes, 12));

            maskData.setDefaultColor(bytes[16]);

            maskData.setFlags(bytes[17]);

            int imageDataLength = fromBigEndianToInt32(bytes, 18);

            byte[] data = new byte[imageDataLength];

            assertAreEqual(maskData.getMaskRectangle().getWidth() *

                    maskData.getMaskRectangle().getHeight(), imageDataLength);

            assertAreEqual(container.read(data), imageDataLength);

            maskData.setImageData(data);

        }

        finally

        {

            container.dispose();

        }

        // Menambahkan LayerMaskData saja tidak cukup untuk penyimpanan yang benar karena channel tidak diperbarui;

        // layer.setLayerMaskData(mask); // Ini tidak menambahkan saluran masker

        // Menambahkan (atau memperbarui) masker

        layer.addLayerMask(maskData); // Tapi ini menambah/memperbarui kedua masker dan saluran! 

        }

}

LocalScopeExtension $ = new LocalScopeExtension();

// Contoh ini menunjukkan bagaimana mendapatkan, memperbarui, menghapus, dan menambahkan masker layer raster

// dalam file Photoshop® PSD secara pemrograman.

PngOptions pngOptions = new PngOptions();

pngOptions.setColorType(PngColorType.TruecolorWithAlpha);

String sourceFilePath = "FourWithMasks.psd";

PsdImage image = (PsdImage)Image.load(sourceFilePath);

try

{

    Layer layer = image.getLayers()[2];

    // Dapatkan masker raster dari layer dan simpan ke berkas

    $.saveRasterMask("FourWithMasks2.msk", layer);

    // Ubah masker layer (balik) dan simpan gambar

    LayerMaskData mask = layer.getLayerMaskData();

    byte[] maskData = mask.getImageData();

    for (int i = 0; i < maskData.length; i++)

    {

        maskData[i] = (byte)~maskData[i];

    }

    // Hanya mengubah LayerMaskData cukup untuk efek rendering

    image.save("FourWithMasksUpdated2.png", pngOptions);

    // Tetapi hanya mengubah LayerMaskData tidak cukup untuk penyimpanan yang benar karena channel tidak diperbarui;

    layer.setLayerMaskData(mask); // Ini juga tidak berhasil

    layer.addLayerMask(mask); // Tapi ini mengupdate kedua masker dan saluran!

    image.save("FourWithMasksUpdated2.psd");

    // Hapus masker raster dari layer dan simpan gambar

    layer.setLayerMaskData(null); // Hanya menghapus LayerMaskData cukup untuk efek rendering tetapi tidak untuk penyimpanan ke format PSD

    image.save("FourWithMasksRemoved2.png", pngOptions);

    layer.addLayerMask(null); // Tetapi ini menghapus baik masker maupun saluran masker!

    image.save("FourWithMasksRemoved2.psd");

    // Tambahkan masker raster dari berkas ke layer dan simpan gambar

    $.addRasterMask(layer, "raster.msk");

    image.save("FourWithMasksAdded2.png", pngOptions);

    image.save("FourWithMasksAdded2.psd");

}

finally

{

    image.dispose();

}

PSDJAVA-221: Urutan Layer Tidak Tepat setelah menambahkan Layer Group ke Layer Group kosong

 // Contoh mendemonstrasikan cara menambahkan layer group bersarang ke PSD secara pemrograman.

String dstPsdPath = "output.psd";

// Membuat gambar dengan ukuran 1x1 piksel untuk bekerja

PsdImage psdImage = new PsdImage(1, 1);

try

{

    // Menambahkan layer group induk ("true" berarti membuka layer group saat dimulai)

    LayerGroup group1 = psdImage.addLayerGroup("Grup 1", 0, true);

    // Menambahkan layer group bersarang

    LayerGroup group2 = group1.addLayerGroup("Grup 2", 0);

    if (group1.getLayers().length != 2)

    {

        throw new RuntimeException("Grup 1 harus berisi dua layer Grup 2.");

    }

    // Memverifikasi bahwa tidak ada pengecualian saat menyimpan layer group yang baru saja dibuat

    psdImage.save(dstPsdPath);

}

finally

{

    psdImage.dispose();

}

PSDJAVA-223: Pengecualian saat memuat file PSD khusus dengan compound LnkE Resource dan properti adobeStockLicenseState

 // Contoh mendemonstrasikan cara membaca dan mengubah sumber daya tautan eksternal Adobe® Photoshop®

// (LnkeResource) dengan berbagai sumber daya (gambar, perpustakaan CC) secara pemrograman.

// Kelas yang menyimpan metode dalam cakupan lokal

class LocalScopeExtension

{

    void assertIsTrue(boolean condition)

    {

        if (!condition)

        {

            throw new FormatException("Contoh bekerja tidak benar.");

        }

    }

    void assertAreEqual(Object actual, Object expected)

    {

        assertIsTrue(actual != null && actual.equals(expected));

    }

    void exampleOfComplexLnkEResourceSupport(String srcPsdPath, int length, int length2, Object[] dataSourceExpectedValues)

    {

        // Memuat PSD yang telah ditentukan sebelumnya yang berisi LayerResource dengan beberapa sumber daya

        PsdImage image = (PsdImage)Image.load(srcPsdPath);

        try

        {

            // Mencari LnkeResource

            LnkeResource lnkeResource = null;

            for (LayerResource resource : image.getGlobalLayerResources