Aspose.PSD para .NET 19.9 - Notas de la versión

Clave Resumen Categoría
PSDNET-160 Nombre de capa incorrecto extraído Característica
PSDNET-175 Obtención de propiedades de texto de una porción diferente de texto dentro de TextLayer PSD Característica
PSDNET-190 Soporte para Agregar grupo de capas Característica
PSDNET-192 Soporte de Propiedad de Escala para Capa de Relleno de Degradado Característica
PSDNET-162 Ajuste de Brillo Mejora
PSDNET-174 IndexOutOfRangeException al guardar la imagen PSD como JPEG Error
PSDNET-180 Actualizar texto de capa de texto lanza una excepción Error
PSDNET-182 Guardar imagen PSD después de la operación RotateFlip produce un archivo corrupto que no se puede abrir Error

Cambios en la API pública

APIs añadidas:

  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerGroup.AddLayerGroup(System.String,System.Int32)
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.IText
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.Items
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.Text
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.ProducePortion
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.AddPortion(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.InsertPortion(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.RemovePortion(System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.UpdateLayerData
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Justification
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.FirstLineIndent
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.StartIndent
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.EndIndent
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.SpaceBefore
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.SpaceAfter
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.AutoHyphenate
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.HyphenatedWordSize
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.PreHyphen
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.PostHyphen
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.ConsecutiveHyphens
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Zone
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.WordSpacing
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.LetterSpacing
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.GlyphSpacing
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.AutoLeading
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.LeadingType
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Hanging
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Burasagari
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.KinsokuOrder
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.EveryLineComposer
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Apply(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.IsEqual(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph)
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion.Text
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion.Style
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion.Paragraph
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.FontSize
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.AutoLeading
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Leading
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Tracking
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Kerning
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.FillColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.StrokeColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.HindiNumbers
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Apply(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.IsEqual(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle)
  • P:Aspose.PSD.FileFormats.Psd.Layers.TextLayer.TextData
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientFillSettings.Scale
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GdFlResource.Scale
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Scale

APIs eliminadas:

  • Ninguna

Ejemplos de uso:

PSDNET-160. Nombre de capa incorrecto extraído

Para mostrar correctamente el nombre de la capa, utilice la propiedad DisplayName. Ahora se ha añadido un setter para esta propiedad y la misma se puede modificar. Cuando Photoshop guarda el nombre de la capa utilizando la propiedad Name, los caracteres coreanos se almacenan como byte 63'?' en ASCII. Utilice la propiedad DisplayName porque la propiedad Name no admite caracteres coreanos.

             // realizar cambios en los nombres de las capas y guardarlos

            using (var image = (PsdImage)Image.Load("capas con nombres.psd"))

            {

                for (int i = 0; i < image.Layers.Length; i++)

                {

                    var capa = image.Layers[i];

                    // establecer nuevo valor en la propiedad DisplayName

                    capa.DisplayName += "_modificado";

                }

                image.Save("salida.psd");

            }

PSDNET-175. Obtención de propiedades de texto de una porción diferente de texto dentro de TextLayer PSD

            const double Tolerancia = 0.0001;

            var rutaArchivo = "TresParrafosColores.psd";

            var rutaSalida = "TresParrafosColores_salida.psd";

            using (var im = (PsdImage)Image.Load(rutaArchivo))

            {

                for (int i = 0; i < im.Layers.Length; i++)

                {

                    var capa = im.Layers[i] as TextLayer;

                    if (capa != null)

                    {

                        var porciones = capa.TextData.Items;

                        if (porciones.Length != 4)

                        {

                            throw new Exception();

                        }

                        // Comprobando texto de cada porción

                        if (porciones[0].Text != "Antiguo " ||

                            porciones[1].Text != "color" ||

                            porciones[2].Text != " texto\r" ||

                            porciones[3].Text != "Segundo párrafo\r")

                        {

                            throw new Exception();

                        }

                        // Comprobando datos de párrafos

                        // Los párrafos tienen diferentes justificaciones

                        if (

                            porciones[0].Paragraph.Justification != 0 ||

                            porciones[1].Paragraph.Justification != 0 ||

                            porciones[2].Paragraph.Justification != 0 ||

                            porciones[3].Paragraph.Justification != 2)

                        {

                            throw new Exception();

                        }

                        // Todas las demás propiedades del primer y segundo párrafo son iguales

                        for (int j = 0; j < porciones.Length; j++)

                        {

                            var parrafo = porciones[j].Paragraph;

                            if (Math.Abs(parrafo.AutoLeading - 1.2) > Tolerancia ||

                                parrafo.AutoHyphenate != false ||

                                parrafo.Burasagari != false ||

                                parrafo.ConsecutiveHyphens != 8 ||

                                Math.Abs(parrafo.StartIndent) > Tolerancia ||

                                Math.Abs(parrafo.EndIndent) > Tolerancia ||

                                parrafo.EveryLineComposer != false ||

                                Math.Abs(parrafo.FirstLineIndent) > Tolerancia ||

                                parrafo.GlyphSpacing.Length != 3 ||

                                Math.Abs(parrafo.GlyphSpacing[0] - 1) > Tolerancia ||

                                Math.Abs(parrafo.GlyphSpacing[1] - 1) > Tolerancia ||

                                Math.Abs(parrafo.GlyphSpacing[2] - 1) > Tolerancia ||

                                parrafo.Hanging != false ||

                                parrafo.HyphenatedWordSize != 6 ||

                                parrafo.KinsokuOrder != 0 ||

                                parrafo.LetterSpacing.Length != 3 ||

                                Math.Abs(parrafo.LetterSpacing[0]) > Tolerancia ||

                                Math.Abs(parrafo.LetterSpacing[1]) > Tolerancia ||

                                Math.Abs(parrafo.LetterSpacing[2]) > Tolerancia ||

                                parrafo.LeadingType != LeadingMode.Auto ||

                                parrafo.PreHyphen != 2 ||

                                parrafo.PostHyphen != 2 ||

                                Math.Abs(parrafo.SpaceBefore) > Tolerancia ||

                                Math.Abs(parrafo.SpaceAfter) > Tolerancia ||

                                parrafo.WordSpacing.Length != 3 ||

                                Math.Abs(parrafo.WordSpacing[0] - 0.8) > Tolerancia ||

                                Math.Abs(parrafo.WordSpacing[1] - 1.0) > Tolerancia ||

                                Math.Abs(parrafo.WordSpacing[2] - 1.33) > Tolerancia ||

                                Math.Abs(parrafo.Zone - 36.0) > Tolerancia)

                            {

                                throw new Exception();

                            }

                        }

                        // Comprobando datos de estilo

                        // Los estilos tienen diferentes colores y tamaño de fuente

                        if (Math.Abs(porciones[0].Style.FontSize - 12) > Tolerancia ||

                            Math.Abs(porciones[1].Style.FontSize - 12) > Tolerancia ||

                            Math.Abs(porciones[2].Style.FontSize - 12) > Tolerancia ||

                            Math.Abs(porciones[3].Style.FontSize - 10) > Tolerancia)

                        {

                            throw new Exception();

                        }

                        if (porciones[0].Style.FillColor != Color.FromArgb(255, 145, 0, 0) ||

                            porciones[1].Style.FillColor != Color.FromArgb(255, 201, 128, 2) ||

                            porciones[2].Style.FillColor != Color.FromArgb(255, 18, 143, 4) ||

                            porciones[3].Style.FillColor != Color.FromArgb(255, 145, 42, 100))

                        {

                            throw new Exception();

                        }

                        for (int j = 0; j < porciones.Length; j++)

                        {

                            var estilo = porciones[j].Style;

                            if (estilo.AutoLeading != false ||

                                estilo.HindiNumbers != false ||

                                estilo.Kerning != 0 ||

                                estilo.Leading != 0 ||

                                estilo.StrokeColor != Color.FromArgb(255, 175, 90, 163) ||

                                estilo.Tracking != 50)

                            {

                                throw new Exception();

                            }

                        }

                        // Ejemplo de edición de texto

                        porciones[0].Text = "Hola ";

                        porciones[1].Text = "Mundo";

                        // Ejemplo de eliminación de porciones de texto

                        capa.TextData.RemovePortion(3);

                        capa.TextData.RemovePortion(2);

                        // Ejemplo de agregar nueva porción de texto

                        var porcionCreada = capa.TextData.ProducePortion();

                        porcionCreada.Text = "!!!\r";

                        capa.TextData.AddPortion(porcionCreada);

                        porciones = capa.TextData.Items;

                        // Ejemplo de edición de párrafo y estilo para porciones

                        // Establecer justificación derecha

                        porciones[0].Paragraph.Justification = 1;

                        porciones[1].Paragraph.Justification = 1;

                        porciones[2].Paragraph.Justification = 1;

                        // Colores diferentes para cada estilo. Serán cambiados, pero la renderización no está completamente soportada

                        porciones[0].Style.FillColor = Color.Aquamarina;

                        porciones[1].Style.FillColor = Color.Violeta;

                        porciones[2].Style.FillColor = Color.AzulClaro;

                        // Fuente diferente. Será cambiada, pero la renderización no está completamente soportada

                        porciones[0].Style.FontSize = 6;

                        porciones[1].Style.FontSize = 8;

                        porciones[2].Style.FontSize = 10;

                        capa.TextData.UpdateLayerData();

                        im.Save(rutaSalida, new PsdOptions(im));

                        break;

                    }

                }

            }

PSDNET-190. Soporte para Agregar grupo de capas

             // -Grupo 1

            // --Capa 1

            // --Grupo 2

            // ---Capa 2

            // ---Capa 3

            // --Capa 4

            string rutaDatos = "prueba_psdnet190.psd";

            var opcionesCreacion = new PsdOptions();

            opcionesCreacion.Source = new FileCreateSource(rutaDatos, false);

            opcionesCreacion.Palette = new PsdColorPalette(new Color[] { Color.Verde });

            using (var imagenPsd = (PsdImage)Image.Create(opcionesCreacion, 500, 500))

            {

                LayerGroup grupo1 = imagenPsd.AddLayerGroup("Grupo 1", 0, true);

                Layer capa1 = new Layer(imagenPsd);

                capa1.Name = "Capa 1";

                grupo1.AddLayer(capa1);

                LayerGroup grupo2 = grupo1.AddLayerGroup("Grupo 2", 1);

                Layer capa2 = new Layer(imagenPsd);

                capa2.Name = "Capa 2";

                grupo2.AddLayer(capa2);

                Layer capa3 = new Layer(imagenPsd);

                capa3.Name = "Capa 3";

                grupo2.AddLayer(capa3);

                Layer capa4 = new Layer(imagenPsd);

                capa4.Name = "Capa 4";

                grupo1.AddLayer(capa4);

                imagenPsd.Save();

            }

PSDNET-192. Soporte de Propiedad de Escala para Capa de Relleno de Degradado

            using (var imagen = (PsdImage)Image.Load("CapaRellenoDegradado.psd"))

            {

                // obteniendo una capa de relleno

                FillLayer capaRelleno = null;

                foreach (var capa in imagen.Layers)

                {

                    capaRelleno = capa as FillLayer;

                    if (capaRelleno != null)

                    {

                        break;

                    }

                }

                var ajustes = capaRelleno.FillSettings as IGradientFillSettings;

                // actualizar valor de escala

                ajustes.Scale = 200;

                capaRelleno.Update(); // Actualiza los datos de píxeles

                imagen.Save("imagenEscala.png", new PngOptions() { TipoColor = PngColorType.TruecolorWithAlpha });

            }

PSDNET-174. IndexOutOfRangeException al guardar la imagen PSD como JPEG

          using (var imagen = Aspose.PSD.Image.Load("EjemploPSD.psd"))

        {

            imagen.Save("ejemploJPG.jpg", new JpegOptions());

        }

PSDNET-180. Actualizar el texto de capa de texto lanza una excepción

           // Actualizar el texto de capa de texto lanza una excepción

            string rutaArchivo = "VoltearVertical.psd";