Notas de la versión Aspose.PSD for Java 24.5

Clave Resumen Categoría
PSDJAVA-617 [Formato AI] Agregar soporte para manejar archivos AI con encabezado EPSF Funcionalidad
PSDJAVA-620 La semitransparencia se procesa de forma incorrecta en la vista previa del archivo psd Error
PSDJAVA-621 La representación de la Capa de forma es parcialmente incorrecta Error
PSDJAVA-622 Excepción al guardar archivos PSD con tamaño superior a 200 MB y dimensiones grandes (hay un problema de consumo de memoria) Error
PSDJAVA-623 Error de excepción al guardar la imagen en PDF después de actualizar de 23.7 a 24.3 Error
PSDJAVA-624 Corregir el problema en el método GetFontInfoRecords para las fuentes chinas Error

Cambios en la API pública

APIs añadidas:

  • M: com.aspose.psd.fileformats.ai.AiLayerSection.getColorIndex
  • M: com.aspose.psd.fileformats.ai.AiLayerSection.setColorIndex(int)
  • M: com.aspose.psd.fileformats.ai.AiLayerSection.hasMultiLayerMasks
  • M: com.aspose.psd.fileformats.ai.AiLayerSection.setMultiLayerMasks(boolean)
  • M: com.aspose.psd.imageoptions.PsdOptions.getBackgroundContents
  • M: com.aspose.psd.imageoptions.PsdOptions.setBackgroundContents(com.aspose.psd.fileformats.psd.rawcolor.RawColor)

APIs eliminadas:

  • Ninguna

Ejemplos de uso:

PSDJAVA-617. [Formato AI] Agregar soporte para manejar archivos AI con encabezado EPSF

    public static void main(String[] args) {
        String archivoFuente = "src/main/resources/ejemplo.ai";
        String rutaSalidaArchivo = "src/main/resources/ejemplo.png";

        try (AiImage imagen = (AiImage) Image.load(archivoFuente)) {
            assertAreEqual(imagen.getLayers().length, 2);
            assertAreEqual(imagen.getLayers()[0].hasMultiLayerMasks(), false);
            assertAreEqual(imagen.getLayers()[0].getColorIndex(), -1);
            assertAreEqual(imagen.getLayers()[1].hasMultiLayerMasks(), false);
            assertAreEqual(imagen.getLayers()[1].getColorIndex(), -1);

            imagen.save(rutaSalidaArchivo, new PngOptions());
        }
    }

    static void assertAreEqual(Object esperado, Object actual) {
        assertAreEqual(esperado, actual, "Los objetos no son iguales.");
    }

    static void assertAreEqual(Object esperado, Object actual, String mensaje) {
        if (!esperado.equals(actual)) {
            throw new IllegalArgumentException(mensaje);
        }
    }

PSDJAVA-620. La semitransparencia se procesa de forma incorrecta en la vista previa del archivo psd

        String archivoFuente = "src/main/resources/frog_nosymb.psd";
        String archivoSalida = "src/main/resources/frog_nosymb_backgroundcontents_output.psd";

        try (PsdImage imagenPsd = (PsdImage) Image.load(archivoFuente)) {
            RawColor colorFondo = new RawColor(PixelDataFormat.getRgb32Bpp());
            int valorArgb = 255 << 24 | 255 << 16 | 255 << 8 | 255;
            colorFondo.setAsInt(valorArgb); // Blanco

            PsdOptions opcionesPsd = new PsdOptions(imagenPsd);
            opcionesPsd.setColorMode(ColorModes.Rgb);
            opcionesPsd.setCompressionMethod(CompressionMethod.RLE);
            opcionesPsd.setChannelsCount((short) 4);
            opcionesPsd.setBackgroundContents(colorFondo);

            imagenPsd.save(archivoSalida, opcionesPsd);
        }

PSDJAVA-621. La representación de la Capa de forma es parcialmente incorrecta

    private static final int RelacionImgToPsd = 256 * 65535;

    public static void main(String[] args) {
        String archivoFuente = "src/main/resources/ShapeLayerTest.psd";
        String archivoSalida = "src/main/resources/ShapeLayerTest_output.psd";
        
        try (PsdImage im = (PsdImage) Image.load(archivoFuente)) {
            ShapeLayer capaForma = (ShapeLayer) im.getLayers()[2];
            IPath ruta = capaForma.getPath();
            IPathShape[] formasRuta = ruta.getItems();
            List<BezierKnotRecord> listaNudos = new ArrayList<>();
            for (IPathShape formaRuta : formasRuta) {
                BezierKnotRecord[] nudos = formaRuta.getItems();
                Collections.addAll(listaNudos, nudos);
            }

            // Cambiar propiedades de la capa
            PathShape nuevaForma = new PathShape();

            BezierKnotRecord primerRegistroNudoBezier = new BezierKnotRecord();
            primerRegistroNudoBezier.setLinked(true);
            primerRegistroNudoBezier.setPoints(new Point[]{
                    pointFToResourcePoint(
                            new PointF(100, 100),
                            capaForma.getContainer().getSize()),
                    pointFToResourcePoint(
                            new PointF(100, 100),
                            capaForma.getContainer().getSize()),
                    pointFToResourcePoint(
                            new PointF(100, 100),
                            capaForma.getContainer().getSize())});

            BezierKnotRecord segundoRegistroNudoBezier = new BezierKnotRecord();
            segundoRegistroNudoBezier.setLinked(true);
            segundoRegistroNudoBezier.setPoints(new Point[]{
                    pointFToResourcePoint(
                            new PointF(50, 490),
                            capaForma.getContainer().getSize()),
                    pointFToResourcePoint(
                            new PointF(100, 490),
                            capaForma.getContainer().getSize()), // Punto de anclaje
                    pointFToResourcePoint(
                            new PointF(150, 490),
                            capaForma.getContainer().getSize())
            });

            BezierKnotRecord tercerRegistroNudoBezier = new BezierKnotRecord();
            tercerRegistroNudoBezier.setLinked(true);
            tercerRegistroNudoBezier.setPoints(new Point[]{
                    pointFToResourcePoint(
                            new PointF(490, 150),
                            capaForma.getContainer().getSize()),
                    pointFToResourcePoint(
                            new PointF(490, 50),
                            capaForma.getContainer().getSize()),
                    pointFToResourcePoint(
                            new PointF(490, 20),
                            capaForma.getContainer().getSize()),
            });

            BezierKnotRecord[] nudosBezier = new BezierKnotRecord[]
                    {primerRegistroNudoBezier, segundoRegistroNudoBezier, tercerRegistroNudoBezier};

            nuevaForma.setItems(nudosBezier);

            List<IPathShape> nuevasFormas = new ArrayList<>(Arrays.asList(formasRuta));
            nuevasFormas.add(nuevaForma);

            IPathShape[] formasRutaNueva = nuevasFormas.toArray(new IPathShape[0]);
            ruta.setItems(formasRutaNueva);

            capaForma.update();

            im.save(archivoSalida, new PsdOptions());
        }

        try (PsdImage im = (PsdImage) Image.load(archivoSalida)) {
            ShapeLayer capaForma = (ShapeLayer) im.getLayers()[2];
            IPath ruta = capaForma.getPath();
            IPathShape[] formasRuta = ruta.getItems();
            List<BezierKnotRecord> listaNudos = new ArrayList<>();
            for (IPathShape formaRuta : formasRuta) {
                BezierKnotRecord[] nudos = formaRuta.getItems();
                listaNudos.addAll(Arrays.asList(nudos));
            }

            assertAreEqual(3, formasRuta.length);
            assertAreEqual(42, capaForma.getLeft());
            assertAreEqual(14, capaForma.getTop());
            assertAreEqual(1600, capaForma.getBounds().getWidth());
            assertAreEqual(1086, capaForma.getBounds().getHeight());
        }
    }

    static Point pointFToResourcePoint(PointF punto, Size tamañoImagen) {
        return new Point(
                (int) Math.round(punto.getY() * (RelacionImgToPsd / tamañoImagen.getHeight())),
                (int) Math.round(punto.getX() * (RelacionImgToPsd / tamañoImagen.getWidth())));
    }

    static void assertAreEqual(Object esperado, Object actual) {
        assertAreEqual(esperado, actual, "Los objetos no son iguales.");
    }

    static void assertAreEqual(Object esperado, Object actual, String mensaje) {
        if (!esperado.equals(actual)) {
            throw new IllegalArgumentException(mensaje);
        }
    }

PSDJAVA-622. Excepción al guardar archivos PSD con tamaño superior a 200 MB y dimensiones grandes (hay un problema de consumo de memoria)

    String archivoFuente = "src/main/resources/archivogrande.psd";
    String archivoSalida = "src/main/resources/salida_raw.psd";

    PsdLoadOptions opcionesCarga = new PsdLoadOptions();
    opcionesCarga.setLoadEffectsResource(true);
    opcionesCarga.setUseDiskForLoadEffectsResource(true);

    try (PsdImage imagenPsd = (PsdImage) Image.load(archivoFuente, opcionesCarga)) {
        PsdOptions opcionesPsd = new PsdOptions();
        opcionesPsd.setCompressionMethod(CompressionMethod.RLE);

        // No debería haber errores aquí
        imagenPsd.save(archivoSalida, opcionesPsd);
    }

PSDJAVA-623. Error de excepción al guardar la imagen en PDF después de actualizar de 23.7 a 24.3

    String archivoFuente = "src/main/resources/CVFlor.psd";
    String archivoSalida = "src/main/resources/_export.pdf";

    try (PsdImage imagenPsd = (PsdImage) Image.load(archivoFuente)) {
        PdfOptions opcionesGuardado = new PdfOptions();
        opcionesGuardado.setPdfCoreOptions(new PdfCoreOptions());

        imagenPsd.save(archivoSalida, opcionesGuardado);
    }

PSDJAVA-624. Corregir el problema en el método GetFontInfoRecords para las fuentes chinas

    String carpetaFuente = "src/main/resources/Fuente";
    String archivoFuente = "src/main/resources/bd-worlds-best-pink.psd";

    PsdLoadOptions opcionesCargaPsd = new PsdLoadOptions();
    opcionesCargaPsd.setLoadEffectsResource(true);
    opcionesCargaPsd.setAllowWarpRepaint(true);

    try {
        FontSettings.setFontsFolders(new String[]{carpetaFuente}, true);

        try (PsdImage imagen = (PsdImage) PsdImage.load(archivoFuente, opcionesCargaPsd)) {
            for (Layer capa : imagen.getLayers()) {
                if (capa instanceof TextLayer) {
                    TextLayer capaTexto = (TextLayer) capa;

                    if ("best".equals(capaTexto.getText())) {
                        // Sin esta corrección aquí habría una excepción debido a la fuente china.
                        capaTexto.updateText("ÉXITO");
                    }
                }
            }
        }
    } finally {
        FontSettings.reset();
    }